Aşağıdaki betiği çalıştırıyorum:
VAR="Test"
sh -c 'echo "Hello $VAR"'
Ama anladım:
# ./test.sh
Hello
VARKomut 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
VARKomut dosyamın değişkenini oluşturulan kabuğa nasıl gönderebilirim sh -c '...'?
Yanıtlar:
exportBir 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'"
$VARgibi 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"`
$0hata / 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.shgibi 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.shgeçerli dizinde (bunun aksine $PATH) . ./var_init.sh