Eh, "$@"
konumsal parametre listesine genişler, konumsal parametre başına bir argüman.
Yaptığınızda:
set '' 'foo bar' $'blah\nblah'
cmd "$@"
cmd
şu 3 argümanla çağrılıyor: boş dize foo bar
ve blah<newline>blah
. Kabuk, execve()
sistem çağrısını şöyle bir şeyle çağırır:
execve("/path/to/cmd", ["cmd", "", "foo bar", "blah\nblah"], [envvars...]);
Aynı çağrıyı yeniden oluşturacak bir kabuk komut satırını (kabuk dilinde kod) yeniden oluşturmak istiyorsanız, şöyle bir şey yapabilirsiniz:
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 "$@"
Veya zsh
farklı teklif türlerini sormakla:
$ 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'
Veya zsh
, bash
veya ksh93
(burada bash
, diğer kabuklarla YMMV için ):
$ set '' 'foo bar' $'blah\nblah'
$ printf cmd; printf ' %q' "$@"; printf '\n'
cmd '' foo\ bar $'blah\nblah'
Kabuğun yürüteceklerini yazdırmasına neden olan kabuğun xtrace seçeneğini de kullanabilirsiniz:
$ (PS4=; set -x; : cmd "$@")
: cmd '' 'foo bar' 'blah
blah'
Yukarıda, :
no-op komutunu cmd
ve konum parametrelerini argüman olarak çalıştırdık. Kabuğum onları kabuğa çıkma için uygun güzel bir şekilde bastırdı. Bütün mermiler bunu yapmaz.
$
yapmanın ters eğik çizgileri, genişleme ve diğer çift tırnakları korumada çok yararlı olmadığını unutmayın . Bu nedenle, diğer yanıtlar , dizenin içindeki tek tırnakları işlemek için bazı uzunluklara giderken tek tırnak kullanır veya dizenin alıntılanmış bir kopyasını oluşturmak için kabuğun kendi özelliklerini kullanır.