
Estou tentando usar as expansões de parâmetro Bash para modificar a saída de uma substituição de comando ou outra expansão de parâmetro.
As seguintes expansões aninhadas funcionam muito bem no Zsh; mas resulta em um erro de "substituição incorreta" no Bash:
${${PWD##*/}//trunk/latest}
ou
${$(basename $PWD)//trunk/latest}
a saída deve ser a última pasta do $PWD
, substituída por latest
quando meu diretório atual fortrunk
assim /home/user/trunk
deveria se tornarlatest
Existe um equivalente do Bash que permite encadear expansões sem depender de variáveis ou pipes? Ou as expansões do Bash permitem apenas que a entrada seja uma string ou uma variável simples?
Responder1
Não, esse aninhamento de operadores de substituição é exclusivo dezsh
.
Observe que com zsh
like with (t)csh
, você também pode fazer${PWD:t:s/trunk/latest/}
.
No entantobash
també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}
Responder2
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]}
Responder3
você quer...?
PWD=latest
Não vejo um método para sua solicitação. Se você deseja substituir todos os $PWD
mais recentes - embora a melhor maneira de fazer isso seja cd
o mais recente.
[ /home/user/trunk = "$PWD" ] && OLDPWD=../latest cd -
... que o levará ao mais recente 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