
Ich versuche, die Bash-Parametererweiterungen zu verwenden, um die Ausgabe einer Befehlsersetzung oder einer anderen Parametererweiterung zu ändern.
Die folgenden verschachtelten Erweiterungen funktionieren in Zsh recht gut, führen jedoch in Bash zu einem „falschen Substitutionsfehler“:
${${PWD##*/}//trunk/latest}
oder
${$(basename $PWD)//trunk/latest}
die Ausgabe sollte der letzte Ordner des sein $PWD
, ersetzt durch latest
wenn mein aktuelles Verzeichnis isttrunk
so /home/user/trunk
sollte werdenlatest
Gibt es ein Bash-Äquivalent, das das Verketten von Erweiterungen ohne die Verwendung von Variablen oder Pipes ermöglicht? Oder erlauben Bash-Erweiterungen als Eingabe nur Zeichenfolgen oder einfache Variablen?
Antwort1
Nein, diese Verschachtelung von Substitutionsoperatoren ist einzigartig für zsh
.
Beachten Sie, dass Sie mit zsh
„Gefällt mir“ (t)csh
auch „ ausführen können ${PWD:t:s/trunk/latest/}
.
Obwohl bash
diese CSH-Verlaufsmodifikatoren auch für die Verlaufserweiterung unterstützt werden, werden sie für die Parametererweiterungen nicht unterstützt.
Verwenden Sie hier mit bash
eine temporäre Variable:
var=${PWD##*/} var=${var//trunk/latest}
Antwort2
Versuchen Sie Folgendes mit Bash:
[[ $PWD =~ .*/(.*) ]] && echo "${BASH_REMATCH[1]//trunk/latest}"
oder mit einem Befehl:
[[ $PWD =~ .*/(.*) && ${BASH_REMATCH[1]//trunk/latest} =~ (.*) ]]
Das Ergebnis liegt vor${BASH_REMATCH[1]}
Antwort3
Möchtest du...?
PWD=latest
Ich sehe keine Methode für Ihre Anfrage. Wenn Sie alles durch $PWD
latest ersetzen möchten, ist die beste Möglichkeit, dies zu tun, jedoch, cd
durch latest zu ersetzen.
[ /home/user/trunk = "$PWD" ] && OLDPWD=../latest cd -
...wodurch Sie zur neuesten Version gelangen und den Pfadnamen auf stdout ausgeben. Sie können genau dorthin zurückkehren, wo Sie hergekommen sind, indem Sie es cd -
noch einmal tun. Sie können dasselbe mit tun $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