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?
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?
Jawaban:
Dari man sh
-c string If the -c option is present, then commands are read from string.
If there are arguments after the string, they are assigned to the
positional parameters, starting with $0
Itu berarti perintah Anda harus seperti ini:
$ sh -c 'echo "$0"' foo
foo
Demikian pula:
$ sh -c 'echo "$0 $1"' foo bar
foo bar
Itu adalah bagian pertama yang dipahami; kasus kedua sederhana dan tidak perlu penjelasan, saya kira.
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'
$ echo foo
foo
Panggilan ini echo
dengan argumen foo dan foo dicetak.
$ /bin/sh -c echo foo
Ini memanggil shell dengan argumen echo
dan memberikan foo sebagai argumen
$0
. The echo
output baris baru dan Anda membuang foo . Jika Anda ingin menampilkan foo , kutip argumennya:
sh -c 'echo foo'
atau gunakan argumen yang disediakan:
sh -c 'echo $0' foo
Dalam contoh ini
$ /bin/sh -c 'echo foo; echo bar'
foo
bar
Shell dipanggil dengan argumen echo foo; echo bar
yang menghasilkan
foo
bar
Dalam perintah ini:
echo foo
echo
adalah biner (atau perintah bawaan) dan foo
merupakan argumen pertama.
Sini:
/bin/sh -c echo foo
/bin/sh
adalah biner, yang argumen pertamanya adalah -c
, yang dengan sendirinya menerima "string perintah" sebagai parameter. Ini echo
dalam contoh di atas. Lalu ada argumen ketiga: foo
yang merupakan argumen untuk /bin/sh
, bukan untuk echo
. Itu sebabnya dalam contoh ketiga Anda:
/bin/sh -c 'echo foo; echo bar'
... 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".
Struktur sh -c word
hanya mengeksekusi kata (dalam shell).
Kata-kata yang ditambahkan berarti hal-hal lain, seperti argumen nol, satu, dua, dll .:
sh -c word zero one two three
untuk menjaga perintah yang memiliki spasi sebagai satu kata, mengutip diperlukan:
sh -c 'echo fnord' zero one two three
jadi, ini mencetak semua argumen:
$ sh -c 'echo "args=" "$0" "$@"' zero one two three
args = zero one two three
Dalam contoh yang Anda sajikan: /bin/sh -c echo foo
Kata pertama (setelah opsi) adalah echo
, itulah yang dieksekusi. Dan gema tanpa teks hanya akan mencetak baris baru, tidak ada yang lain:
$ / bin / sh -c echo foo
Itu sebabnya Anda mendapatkan garis kosong.
Jika Anda mengutip spasi, Anda akan mengeksekusi "satu kata" (tanpa spasi), karena ini:
$ / bin / sh -c echo \ foo foo $ / bin / sh -c "echo foo" foo $ / bin / sh -c 'echo foo' foo
Simpan perintah yang dieksekusi sebagai satu "kata" menggunakan mengutip.
sh -c 'echo $1' echo foo