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

9

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

Os seguintes comandos funcionam muito bem em zsh; mas resulta em um erro bad substitution 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 for trunk

então /home/user/trunk deve se tornar latest

Existe um equivalente bash que permite encadear edições de strings sem depender de variáveis ou pipes? Ou os embutidos do bash só permitem que a entrada seja uma string ou uma variável simples?

    
por yabuki_joe 06.01.2016 / 13:08

3 respostas

9

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

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

Embora bash 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âmetro.

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

var=${PWD##*/} var=${var//trunk/latest}
    
por 06.01.2016 / 17:00
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]}

    
por 06.01.2016 / 14:02
0

você quer ...?

PWD=latest

Não vejo um método para sua solicitação. Se você quiser substituir todo o $PWD w / latest - embora a melhor maneira de fazer isso seja cd para o mais recente.

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

... que o levará para o mais recente e imprimirá o nome do caminho para stdout. Você pode voltar exatamente 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
    
por 06.01.2016 / 16:15

Tags