Durch die Befehlssubstitution kann die Ausgabe eines Befehls anstelle des Befehlsnamens selbst ersetzt werden. Die Befehlsersetzung erfolgt, wenn der Befehl wie folgt beigefügt ist:
$(command)
oder (rückzitierte Version):
`command`
Die Shell erweitert die Befehlssubstitution, indem sie den Befehl
in einer Subshell-Umgebung ausführt (siehe Shell-Ausführungsumgebung ) und die Befehlssubstitution ( Befehlstext plus das einschließende "$ ()" oder Backquotes) durch die Standardausgabe des Befehls ersetzt Sequenzen von einem oder mehreren <newline>
Zeichen am Ende der Ersetzung. Eingebettet<newline>
Zeichen vor dem Ende der Ausgabe dürfen nicht entfernt werden. Sie können jedoch als Feldtrennzeichen behandelt und während der Feldaufteilung entfernt werden, abhängig vom Wert des IFS und dem gültigen Angebot. Wenn die Ausgabe Null-Bytes enthält, ist das Verhalten nicht angegeben.
Innerhalb des rückzitierten Stils der Befehlssubstitution <backslash>
bleibt seine wörtliche Bedeutung erhalten, außer wenn gefolgt von: ' $
', ' `
' oder
<backslash>
. Die Suche nach dem passenden Backquote wird durch das erste nicht zitierte, nicht maskierte Backquote erfüllt. Wenn bei dieser Suche in einem Shell-Kommentar, einem Here-Dokument, einer eingebetteten Befehlsersetzung des $ ( Befehls- ) Formulars oder einer Zeichenfolge in Anführungszeichen ein nicht maskiertes Backquote gefunden wird , treten undefinierte Ergebnisse auf. Eine Zeichenfolge in einfachen oder doppelten Anführungszeichen, die innerhalb der `...`
Sequenz " " beginnt, aber nicht endet, führt zu undefinierten Ergebnissen.
Mit dem Formular $ ( Befehl ) bilden alle Zeichen, die der offenen Klammer bis zur übereinstimmenden schließenden Klammer folgen, den
Befehl . Jedes gültige Shell-Skript kann für Befehle verwendet werden , mit Ausnahme eines Skripts, das ausschließlich aus Umleitungen besteht und nicht angegebene Ergebnisse liefert.
Die Ergebnisse der Befehlssubstitution dürfen nicht für eine weitere Tildeerweiterung, Parametererweiterung, Befehlssubstitution oder arithmetische Erweiterung verarbeitet werden. Wenn eine Befehlssubstitution in doppelten Anführungszeichen erfolgt, dürfen für die Ergebnisse der Substitution keine Feldaufteilung und Pfadnamenerweiterung durchgeführt werden.
Befehlsersetzung kann verschachtelt werden. Um die Verschachtelung innerhalb der Backquoted-Version festzulegen, muss die Anwendung den inneren Backquotes <backslash>
Zeichen vorangestellt haben. beispielsweise:
\`command\`
Die Syntax der Shell-Befehlssprache ist für Erweiterungen, die mit "$((
", die eine arithmetische Erweiterung oder eine Befehlssubstitution einführen kann, die mit einer Unterschale beginnt. Die arithmetische Erweiterung hat Vorrang; das heißt, die Shell muss zuerst bestimmen, ob sie die Erweiterung als arithmetische Erweiterung analysieren kann, und die Erweiterung nur als Befehl analysieren Ersetzen, wenn festgestellt wird, dass die Erweiterung nicht als arithmetische Erweiterung analysiert werden kann. Die Shell muss bei dieser Bestimmung keine verschachtelten Erweiterungen auswerten. Wenn sie auf das Ende der Eingabe stößt, ohne bereits festgestellt zu haben, dass die Erweiterung nicht als arithmetische Erweiterung analysiert werden kann, wird die Shell behandelt die Erweiterung als unvollständige arithmetische Erweiterung und meldet einen Syntaxfehler. Eine konforme Anwendung muss sicherstellen, dass sie die "$(
" und "getrennt werden.(
'in zwei Token (dh durch Leerzeichen trennen) in einer Befehlssubstitution, die mit einer Unterschale beginnt. Beispielsweise könnte eine Befehlssubstitution, die eine einzelne Unterschale enthält, wie folgt geschrieben werden:
$( (command) )
$()
ist POSIX und wird von allen modernen Bourne-Shells unterstützt, z. B. Ksh, Bash, Ash, Dash, Zsh, Busybox. (Ein nicht so modernes ist Solaris/bin/sh
, aber unter Solaris sollten Sie/usr/xpg4/bin/sh
stattdessen das moderne verwenden).