Anda mengartikan halaman manual salah. Pertama, bagian tentang --
menandakan akhir opsi tidak relevan dengan apa yang Anda coba lakukan. The -c
menimpa sisa baris perintah dari saat itu, sehingga tidak lagi melalui penanganan pilihan bash sama sekali, yang berarti bahwa --
akan melewati ke perintah, tidak ditangani oleh bash sebagai akhir pilihan penanda.
Kesalahan kedua adalah bahwa argumen tambahan ditetapkan sebagai parameter posisi pada proses shell yang diluncurkan, tidak diteruskan sebagai argumen untuk perintah. Jadi, apa yang Anda coba lakukan dapat dilakukan sebagai salah satu dari:
/bin/bash -c 'echo "$0" "$1"' foo bar
/bin/bash -c 'echo "$@"' bash foo bar
Dalam kasus pertama, meneruskan parameter echo $0
dan $1
secara eksplisit, dan dalam kasus kedua, menggunakan "$@"
untuk memperluas normal seperti "semua parameter posisi kecuali $ 0". Perhatikan bahwa dalam hal ini kita harus melewatkan sesuatu untuk digunakan $0
juga; Saya telah memilih "bash" karena itulah yang $0
biasanya, tetapi hal lain akan berhasil.
Adapun alasannya dilakukan dengan cara ini, alih-alih hanya meneruskan argumen yang Anda berikan langsung ke perintah yang Anda daftarkan: perhatikan bahwa dokumentasi mengatakan "perintah s dibaca dari string", jamak. Dengan kata lain, skema ini memungkinkan Anda untuk melakukan:
/bin/bash -c 'mkdir "$1"; cd "$1"; touch "$2"' bash dir file
Tetapi, perhatikan bahwa cara yang lebih baik untuk memenuhi tujuan awal Anda mungkin dengan menggunakan env
daripada bash
:
/usr/bin/env -- "ls" "-l"
Jika Anda tidak memerlukan fitur apa pun yang disediakan oleh shell, tidak ada alasan untuk menggunakannya - menggunakan env
dalam hal ini akan lebih cepat, lebih sederhana, dan lebih sedikit mengetik. Dan Anda tidak perlu berpikir keras untuk memastikannya akan menangani nama file yang berisi karakter meta shell atau spasi kosong dengan aman.