Ich führe das folgende Skript aus:
VAR="Test"
sh -c 'echo "Hello $VAR"'
Aber ich bekomme:
# ./test.sh
Hello
Wie kann ich die Variable VAR
meines Skripts an die mit erstellte Shell senden sh -c '...'
?
Ich führe das folgende Skript aus:
VAR="Test"
sh -c 'echo "Hello $VAR"'
Aber ich bekomme:
# ./test.sh
Hello
Wie kann ich die Variable VAR
meines Skripts an die mit erstellte Shell senden sh -c '...'
?
Antworten:
Verwenden export
Sie diese Option , um eine Umgebungsvariable zu erstellen, oder übergeben Sie sie direkt an den Befehl.
VAR="Test" sh -c 'echo "Hello $VAR"'
VAR="Test"
export VAR
sh -c 'echo "Hello $VAR"'
Vermeiden Sie doppelte Anführungszeichen um den Shell-Code, um die Interpolation zu ermöglichen, da dies zu Sicherheitslücken bei der Befehlsinjektion führt, wie in:
sh -c "echo 'Hallo $ VAR'"
einen Neustart auslösen, wenn er aufgerufen wird, wenn er $VAR
etwas wie enthält';reboot #
export var="Test"
in einer Zeile tun .
Hier ist noch eine andere Möglichkeit, Variablen sh -c
(als Positionsargumente) zu übergeben:
{
VAR="world"
VAR2='!'
sh -c 'echo "Hello ${0}${1}"' "$VAR" "$VAR2"
}
$@
, wie erwartet zu arbeiten, z. sh -c 'echo "Hello $@"' _ "$VAR" "$VAR2"
`
$0
in den Fehler- / Warnmeldungen der Shell angezeigt wird.
Wenn Sie sie nicht als Umgebungsvariablen exportieren möchten, können Sie hier einen Trick ausführen. Speichern Sie Ihre Variablendefinition in einer Datei .var_init.sh
und geben Sie sie wie folgt in Ihre Sub-Shell ein:
.var_init.sh
VAR="Test"
von der Kommandozeile:
sh -c ". .var_init.sh && echo \$VAR" # Make sure to properly escape the '$'
Auf diese Weise legen Sie Ihre Variablen nur bei der Ausführung Ihrer Subshell fest.
ENV=.var_ini.sh sh -c '...'
.var_init.sh
erwartet wird, dass dies im aktuellen Verzeichnis gesucht wird (im Gegensatz zu $PATH
), dies geschrieben werden sollte. ./var_init.sh