Uruchamiam następujący skrypt:
VAR="Test"
sh -c 'echo "Hello $VAR"'
Ale dostaję:
# ./test.sh
Hello
Jak mogę wysłać zmienną VAR
mojego 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ą VAR
mojego skryptu do utworzonej powłoki sh -c '...'
?
Odpowiedzi:
Użyj go, export
aby 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 $VAR
zawiera 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"
`
$0
jest 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.sh
i 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.sh
oczekuje się tego w bieżącym katalogu (w przeciwieństwie do $PATH
), należy napisać. ./var_init.sh