Değişken bir satır içi kabuk betiğine nasıl gönderilir?


26

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:


44

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 #


Gerçekten pratik değil (birkaç değişkenim var ve onların çevre değişkenleri olmasını istemiyorum), ama işe yarıyor, teşekkürler!
Matthieu Napoli

3
@Matthieu: Onlar sizi endişelendiren şeyse, yalnızca sürecinizin çocukları için ortam değişkenleri olarak ayarlanır .
Piskvor

5
Sadece FYI, export var="Test"bir satırda da yapabilirsiniz .
user606723

@Piskvor iyi hassasiyet için teşekkür ederim, o zaman mükemmel.
Matthieu Napoli

9

İş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"
}

1
(+1) Kod değişkenleri için normal $ 1 $ 2 beklentisine paralel olarak daha fazla tutmak için, $ 0 için kukla bir değere sahip olabilir. Bu, $@beklendiği gibi çalışmayı sağlayacaktır , örneğin. sh -c 'echo "Hello $@"' _ "$VAR" "$VAR2"`
Peter.O

2
@ Peter.O "_" kullanmak yerine, "sh" ya da mantıklı bir isim kullanırdım, çünkü bu komut, $0hata / uyarı mesajlarında kabuk tarafından gösterilmektedir.
Stéphane Chazelas

5

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.


... veyaENV=.var_ini.sh sh -c '...'
Kusalananda

Bunun .var_init.shgeçerli dizinde (bunun aksine $PATH) . ./var_init.sh
aranması bekleniyorsa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.