Nah, "$@"
perluas daftar parameter posisi, satu argumen per parameter posisi.
Saat kamu melakukan:
set '' 'foo bar' $'blah\nblah'
cmd "$@"
cmd
sedang dipanggil dengan 3 argumen: string kosong, foo bar
dan blah<newline>blah
. Shell akan memanggil execve()
system call dengan sesuatu seperti:
execve("/path/to/cmd", ["cmd", "", "foo bar", "blah\nblah"], [envvars...]);
Jika Anda ingin merekonstruksi baris perintah shell (yaitu kode dalam bahasa shell) yang akan mereproduksi permintaan yang sama, Anda bisa melakukan sesuatu seperti:
awk -v q="'" '
function shellquote(s) {
gsub(q, q "\\" q q, s)
return q s q
}
BEGIN {
for (i = 1; i < ARGC; i++) {
printf "%s", sep shellquote(ARGV[i])
sep = " "
}
printf "\n"
}' cmd "$@"
Atau dengan zsh
, menanyakan berbagai jenis kutipan:
$ set '' 'foo bar' $'blah\nblah'
$ print -r -- cmd "${(q)@}"
cmd '' foo\ bar blah$'\n'blah
$ print -r -- cmd "${(qq)@}"
cmd '' 'foo bar' 'blah
blah'
$ print -r -- cmd "${(qqq)@}"
cmd "" "foo bar" "blah
blah"
$ print -r -- cmd "${(qqqq)@}"
cmd $'' $'foo bar' $'blah\nblah'
Atau dengan zsh
, bash
atau ksh93
(di sini untuk bash
, YMMV dengan cangkang lain):
$ set '' 'foo bar' $'blah\nblah'
$ printf cmd; printf ' %q' "$@"; printf '\n'
cmd '' foo\ bar $'blah\nblah'
Anda juga bisa menggunakan opsi xtrace shell yang menyebabkan shell untuk mencetak apa yang akan dieksekusi:
$ (PS4=; set -x; : cmd "$@")
: cmd '' 'foo bar' 'blah
blah'
Di atas, kami menjalankan perintah :
no-op dengan cmd
dan parameter posisi sebagai argumen. Cangkang saya mencetaknya dengan cara yang bagus dan cocok untuk dimasukkan kembali ke dalam cangkang. Tidak semua kerang melakukan itu.
$
-perbaikan dan tanda kutip ganda lainnya. Itu sebabnya jawaban lain menggunakan tanda kutip tunggal sambil berusaha keras untuk menangani tanda kutip tunggal di dalam string, atau menggunakan fitur shell sendiri untuk menghasilkan salinan string yang dikutip.