Como usar o bash embutido para substituir a saída de um subshell ou função

9

Estou tentando usar a substring bash embutido para substituir a saída de um subshell ou outra função bash.

Os seguintes comandos funcionam muito bem no zsh; mas resulta em um bad substitutionerro no bash:

${${PWD##*/}//trunk/latest}

ou

${$(basename $PWD)//trunk/latest}

a saída deve ser a última pasta do $PWD, substituída por latestquando meu diretório atual fortrunk

então /home/user/trunkdeve se tornarlatest

Existe um equivalente do bash que permita editar edições de cadeias de caracteres sem depender de variáveis ​​ou pipes? Ou o bash built-ins permite apenas que a entrada seja uma string ou uma variável simples?

yabuki_joe
fonte

Respostas:

9

Não, esse aninhamento de operadores de substituição é exclusivo zsh.

Note que com zshlike with (t)csh, você também pode fazer ${PWD:t:s/trunk/latest/}.

Embora bashtambém suporte esses modificadores de histórico csh para expansão de histórico, ele não os suporta para suas expansões de parâmetros.

Aqui com bash, use uma variável temporária:

var=${PWD##*/} var=${var//trunk/latest}
Stéphane Chazelas
fonte
3

Tente isso com o bash:

[[ $PWD =~ .*/(.*) ]] && echo "${BASH_REMATCH[1]//trunk/latest}"

ou com um comando:

[[ $PWD =~ .*/(.*) && ${BASH_REMATCH[1]//trunk/latest} =~ (.*) ]]

O resultado está em ${BASH_REMATCH[1]}

Cyrus
fonte
0

você quer...?

PWD=latest

Não vejo um método para sua solicitação. Se você deseja substituir todos os recursos $PWDmais recentes - embora a melhor maneira de fazer isso seja o cdmais recente.

[ /home/user/trunk = "$PWD" ] && OLDPWD=../latest cd -

... que o levará para as últimas e imprimirá o nome do caminho para stdout. Você pode voltar de onde veio fazendo cd -novamente. Você pode fazer o mesmo com $CDPATH:

mkdir -p /tmp/{1..5}  ; \
CDPATH=/tmp cd 3; cd -; \
echo "${CDPATH:-empty or unset::}" "$OLDPWD"

/tmp/3
/home/mikeserv
empty or unset:: /tmp/3
mikeserv
fonte
O problema não está na própria substituição, pode ser alcançado sedem poucos passos. Mas eu não entendo por que o bash recusar a execução de subnível, em seguida, substituir o seu conteúdo como qualquer outro corda
yabuki_joe