Aşağıdaki betiği çalıştırıyorum:
VAR="Test"
sh -c 'echo "Hello $VAR"'
Ama anladım:
# ./test.sh
Hello
VAR
Komut dosyamın değişkenini oluşturulan kabuğa nasıl gönderebilirim sh -c '...'
?
Aşağıdaki betiği çalıştırıyorum:
VAR="Test"
sh -c 'echo "Hello $VAR"'
Ama anladım:
# ./test.sh
Hello
VAR
Komut dosyamın değişkenini oluşturulan kabuğa nasıl gönderebilirim sh -c '...'
?
Yanıtlar:
export
Bir ortam değişkenine dönüştürmek için kullanın veya doğrudan komuta iletin.
VAR="Test" sh -c 'echo "Hello $VAR"'
VAR="Test"
export VAR
sh -c 'echo "Hello $VAR"'
Aşağıdaki gibi komut enjeksiyon açıkları getirdiğinden enterpolasyona izin vermek için kabuk kodu etrafında çift tırnak kullanmaktan kaçının:
sh -c "echo 'Merhaba $ VAR'"
$VAR
gibi bir şey içerdiğinde çağrılırsa yeniden başlatmaya neden olmak';reboot #
export var="Test"
bir satırda da yapabilirsiniz .
İşte değişkenleri iletmenin başka bir yolu sh -c
(konumsal argümanlar olarak):
{
VAR="world"
VAR2='!'
sh -c 'echo "Hello ${0}${1}"' "$VAR" "$VAR2"
}
$@
beklendiği gibi çalışmayı sağlayacaktır , örneğin. sh -c 'echo "Hello $@"' _ "$VAR" "$VAR2"
`
$0
hata / uyarı mesajlarında kabuk tarafından gösterilmektedir.
Bunları ortam değişkenleri olarak dışa aktarmak istemiyorsanız işte yapabileceğiniz bir püf noktası. Variabe tanımınızı bir dosyaya kaydedin ve aşağıdaki .var_init.sh
gibi alt kabuğunuza kaynak yapın:
.var_init.sh
VAR="Test"
komut satırından:
sh -c ". .var_init.sh && echo \$VAR" # Make sure to properly escape the '$'
Bu şekilde, değişkenlerinizi yalnızca alt kabuğunuzun çalışmasında ayarlayın.
ENV=.var_ini.sh sh -c '...'
.var_init.sh
geçerli dizinde (bunun aksine $PATH
) . ./var_init.sh