Verwenden der integrierten Bash, um die Ausgabe einer Subshell oder Funktion zu ersetzen

9

Ich versuche, die integrierte Bash-Teilzeichenfolge zu verwenden, um die Ausgabe einer Subshell oder einer anderen Bash-Funktion zu ersetzen.

Die folgenden Befehle funktionieren in zsh recht gut. führt aber zu einem bad substitutionFehler in bash:

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

oder

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

Die Ausgabe sollte der letzte Ordner von sein $PWD, der durch das latestaktuelle Verzeichnis ersetzt wirdtrunk

so /home/user/trunksollte werdenlatest

Gibt es ein Bash-Äquivalent, mit dem Strings-Editionen verkettet werden können, ohne auf Variablen oder Pipes angewiesen zu sein? Oder erlauben Bash-Integrationen nur, dass die Eingabe eine Zeichenfolge oder eine einfache Variable ist?

yabuki_joe
quelle

Antworten:

9

Nein, diese Verschachtelung von Substitutionsoperatoren ist einzigartig für zsh.

Beachten Sie, dass Sie mit zshlike with (t)cshauch tun können ${PWD:t:s/trunk/latest/}.

Obwohl bashauch diese csh Geschichte Modifikatoren für Geschichte Expansion unterstützt, unterstützt es nicht , sich für seine Parameter Erweiterungen.

bashVerwenden Sie hier mit eine temporäre Variable:

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

Versuchen Sie dies mit Bash:

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

oder mit einem Befehl:

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

Das Ergebnis ist in ${BASH_REMATCH[1]}

Cyrus
quelle
0

Möchtest du...?

PWD=latest

Ich sehe keine Methode für Ihre Anfrage. Wenn Sie alles $PWDmit dem neuesten ersetzen möchten - obwohl der beste Weg, dies zu tun, cddas neueste ist.

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

... die Sie auf den neuesten Stand bringen und den Pfadnamen auf stdout drucken. Sie können sofort wieder dorthin zurückkehren, wo Sie herkommen, indem Sie es cd -erneut tun . Sie können das gleiche tun mit $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
quelle
Das Problem liegt nicht in der Substitution selbst, es kann sedin wenigen Schritten erreicht werden. Aber ich verstehe nicht, warum Bash sich weigert, Subshell auszuführen, und dann seinen Inhalt wie jede andere Zeichenfolge ersetzt
yabuki_joe