Uruchamiam następujący skrypt:
VAR="Test"
sh -c 'echo "Hello $VAR"'
Ale dostaję:
# ./test.sh
Hello
Jak mogę wysłać zmienną VARmojego skryptu do utworzonej powłoki sh -c '...'?
Uruchamiam następujący skrypt:
VAR="Test"
sh -c 'echo "Hello $VAR"'
Ale dostaję:
# ./test.sh
Hello
Jak mogę wysłać zmienną VARmojego skryptu do utworzonej powłoki sh -c '...'?
Odpowiedzi:
Użyj go, exportaby przekształcić go w zmienną środowiskową, lub przekaż go bezpośrednio do polecenia.
VAR="Test" sh -c 'echo "Hello $VAR"'
VAR="Test"
export VAR
sh -c 'echo "Hello $VAR"'
Unikaj stosowania podwójnych cudzysłowów wokół kodu powłoki, aby umożliwić interpolację, ponieważ wprowadza to luki w iniekcjach poleceń, takie jak:
sh -c „echo„ Hello $ VAR ””
powodując restart, jeśli zostanie wywołany, gdy $VARzawiera coś takiego';reboot #
export var="Test"w jednym wierszu.
Oto jeszcze inny sposób przekazywania zmiennych sh -c(jako argumentów pozycyjnych):
{
VAR="world"
VAR2='!'
sh -c 'echo "Hello ${0}${1}"' "$VAR" "$VAR2"
}
$@to pracę zgodnie z oczekiwaniami, np. sh -c 'echo "Hello $@"' _ "$VAR" "$VAR2"`
$0jest ono wyświetlane w komunikatach o błędach / ostrzeżeniach przez powłokę.
Jeśli nie chcesz eksportować ich jako zmiennych środowiskowych, oto sztuczka, którą możesz zrobić. Zapisz definicję variabe w pliku .var_init.shi umieść ją w podpowłoce w następujący sposób:
.var_init.sh
VAR="Test"
z linii poleceń:
sh -c ". .var_init.sh && echo \$VAR" # Make sure to properly escape the '$'
W ten sposób ustawiasz zmienne tylko przy wykonywaniu podpowłoki.
ENV=.var_ini.sh sh -c '...'
.var_init.shoczekuje się tego w bieżącym katalogu (w przeciwieństwie do $PATH), należy napisać. ./var_init.sh