Saya menjalankan skrip berikut:
VAR="Test"
sh -c 'echo "Hello $VAR"'
Tapi saya mendapatkan:
# ./test.sh
Hello
Bagaimana saya bisa mengirim variabel VARskrip saya ke shell yang dibuat dengan sh -c '...'?
Saya menjalankan skrip berikut:
VAR="Test"
sh -c 'echo "Hello $VAR"'
Tapi saya mendapatkan:
# ./test.sh
Hello
Bagaimana saya bisa mengirim variabel VARskrip saya ke shell yang dibuat dengan sh -c '...'?
Jawaban:
Baik digunakan exportuntuk mengubahnya menjadi variabel lingkungan, atau meneruskannya langsung ke perintah.
VAR="Test" sh -c 'echo "Hello $VAR"'
VAR="Test"
export VAR
sh -c 'echo "Hello $VAR"'
Hindari menggunakan tanda kutip ganda di sekitar kode shell untuk memungkinkan interpolasi karena itu memperkenalkan kerentanan injeksi perintah seperti di:
sh -c "echo 'Hello $ VAR'"
menyebabkan reboot jika dipanggil ketika $VARberisi sesuatu seperti';reboot #
export var="Test"dalam satu baris.
Berikut ini cara lain untuk meneruskan variabel ke sh -c(sebagai argumen posisi):
{
VAR="world"
VAR2='!'
sh -c 'echo "Hello ${0}${1}"' "$VAR" "$VAR2"
}
$@untuk bekerja seperti yang diharapkan, mis. sh -c 'echo "Hello $@"' _ "$VAR" "$VAR2"`
$0ditampilkan dalam pesan kesalahan / peringatan oleh shell.
Jika Anda tidak ingin mengekspornya sebagai variabel lingkungan, inilah trik yang bisa Anda lakukan. Simpan definisi variabe Anda ke file .var_init.shdan sumber di sub-shell Anda seperti ini:
.var_init.sh
VAR="Test"
dari baris perintah:
sh -c ". .var_init.sh && echo \$VAR" # Make sure to properly escape the '$'
Dengan cara ini, Anda hanya mengatur variabel Anda pada pelaksanaan subkulit Anda.
ENV=.var_ini.sh sh -c '...'
.var_init.shdiharapkan untuk dicari dalam direktori saat ini (tidak seperti $PATH), itu harus ditulis. ./var_init.sh