Come usare il built-in bash per sostituire l'output di una subshell o di una funzione


9

Sto cercando di utilizzare la sottostringa bash integrata per sostituire l'output di una subshell o di un'altra funzione bash.

I seguenti comandi funzionano abbastanza bene in zsh; ma provoca un bad substitutionerrore in bash:

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

o

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

l'output dovrebbe essere l'ultima cartella di $PWD, sostituita da latestquando la mia directory corrente ètrunk

così /home/user/trunkdovrebbe diventarelatest

Esiste un equivalente bash che consente di concatenare le edizioni di stringhe senza fare affidamento su variabili o pipe? O i built-in bash consentono solo che l'input sia una stringa o una variabile semplice?

Risposte:


9

No, la nidificazione degli operatori di sostituzione è unica zsh.

Nota che con zshlike with (t)cshpuoi anche fare ${PWD:t:s/trunk/latest/}.

Sebbene bashsupporti anche quei modificatori di cronologia csh per l'espansione della cronologia, non li supporta per le sue espansioni di parametri.

Qui con bash, usa una variabile temporanea:

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

3

Prova questo con bash:

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

o con un comando:

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

Il risultato è dentro ${BASH_REMATCH[1]}


0

vuoi...?

PWD=latest

Non vedo un metodo per la tua richiesta. Se vuoi sostituire tutto con $PWDw / latest, anche se il modo migliore per farlo è cdquello più recente.

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

... che ti porterà all'ultima versione e stampa il percorso su stdout. Puoi tornare da dove sei venuto facendo di cd -nuovo. Puoi fare lo stesso w / $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

Il problema non sta nella sostituzione stessa, può essere raggiunto con sedin pochi passaggi. Ma non capisco perché bash si rifiuta di eseguire subshell, quindi sostituisce il suo contenuto come qualsiasi altra stringa
yabuki_joe
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.