Saya menjalankan skrip berikut:
VAR="Test"
sh -c 'echo "Hello $VAR"'
Tapi saya mendapatkan:
# ./test.sh
Hello
Bagaimana saya bisa mengirim variabel VAR
skrip 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 VAR
skrip saya ke shell yang dibuat dengan sh -c '...'
?
Jawaban:
Baik digunakan export
untuk 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 $VAR
berisi 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"
`
$0
ditampilkan 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.sh
dan 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.sh
diharapkan untuk dicari dalam direktori saat ini (tidak seperti $PATH
), itu harus ditulis. ./var_init.sh