Misalnya, saat ini berfungsi:
$ echo foo foo
Ini tidak:
$ / bin / sh -c echo foo
Padahal ini tidak:
$ / bin / sh -c 'echo foo; bilah gema foo batang
Apakah ada penjelasan?
shell
command-line
arguments
echo
SilverlightFox
sumber
sumber
sh -c 'echo $1' echo foo
sh -c 'echo "$@"' fnord a b c d ...
sh -c 'echo $0' foo
bukan pilihan terbaik, dengan mempertimbangkan bahwa penanya sudah tahu bahwa itu/bin/sh -c 'echo foo; echo bar'
berfungsi, Anda cukup menjawab dengan mengutip perintah/bin/sh -c 'echo foo'
Panggilan ini
echo
dengan argumen foo dan foo dicetak.Ini memanggil shell dengan argumen
echo
dan memberikan foo sebagai argumen$0
. Theecho
output baris baru dan Anda membuang foo . Jika Anda ingin menampilkan foo , kutip argumennya:atau gunakan argumen yang disediakan:
Dalam contoh ini
Shell dipanggil dengan argumen
echo foo; echo bar
yang menghasilkansumber
Dalam perintah ini:
echo
adalah biner (atau perintah bawaan) danfoo
merupakan argumen pertama.Sini:
/bin/sh
adalah biner, yang argumen pertamanya adalah-c
, yang dengan sendirinya menerima "string perintah" sebagai parameter. Iniecho
dalam contoh di atas. Lalu ada argumen ketiga:foo
yang merupakan argumen untuk/bin/sh
, bukan untukecho
. Itu sebabnya dalam contoh ketiga Anda:... keduanya dicetak. Anda mengutip argumennya. Jadi: argumen pertama adalah
-c
, dan parameter untuk argumen ini adalah'echo foo; echo bar'
yang ditafsirkan secara keseluruhan sebagai satu argumen; sebagai "string perintah".sumber
Struktur
sh -c word
hanya mengeksekusi kata (dalam shell).Kata-kata yang ditambahkan berarti hal-hal lain, seperti argumen nol, satu, dua, dll .:
untuk menjaga perintah yang memiliki spasi sebagai satu kata, mengutip diperlukan:
jadi, ini mencetak semua argumen:
Contohnya
Dalam contoh yang Anda sajikan:
/bin/sh -c echo foo
Kata pertama (setelah opsi) adalahecho
, itulah yang dieksekusi. Dan gema tanpa teks hanya akan mencetak baris baru, tidak ada yang lain:Itu sebabnya Anda mendapatkan garis kosong.
Jika Anda mengutip spasi, Anda akan mengeksekusi "satu kata" (tanpa spasi), karena ini:
Kesimpulan
Simpan perintah yang dieksekusi sebagai satu "kata" menggunakan mengutip.
sumber