Nun, "$@"
erweitert die Liste der Positionsparameter um ein Argument pro Positionsparameter.
Wenn Sie das tun:
set '' 'foo bar' $'blah\nblah'
cmd "$@"
cmd
wird mit diesen 3 Argumenten aufgerufen: der leeren Zeichenfolge foo bar
und blah<newline>blah
. Die Shell ruft den execve()
Systemaufruf mit folgenden Elementen auf:
execve("/path/to/cmd", ["cmd", "", "foo bar", "blah\nblah"], [envvars...]);
Wenn Sie eine Shell-Befehlszeile (dh Code in der Shell-Sprache) rekonstruieren möchten, die denselben Aufruf reproduziert, können Sie Folgendes tun:
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 "$@"
Oder zsh
fragen Sie nach verschiedenen Arten von Zitaten:
$ 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'
Oder mit zsh
, bash
oder ksh93
(hier bash
, YMMV mit anderen Shells):
$ set '' 'foo bar' $'blah\nblah'
$ printf cmd; printf ' %q' "$@"; printf '\n'
cmd '' foo\ bar $'blah\nblah'
Sie können auch die Option xtrace der Shell verwenden, mit der die Shell druckt, was ausgeführt werden soll:
$ (PS4=; set -x; : cmd "$@")
: cmd '' 'foo bar' 'blah
blah'
Oben haben wir den :
Befehl no-op mit cmd
und die Positionsparameter als Argument ausgeführt. Meine Muschel druckte sie in einer gut zitierten Weise, die für die erneute Eingabe in die Muschel geeignet war. Das machen nicht alle Muscheln.
$
Erweiterungen und andere doppelte Anführungszeichen zu schützen . Aus diesem Grund verwenden die anderen Antworten einfache Anführungszeichen, während sie einige Längen verwenden, um einfache Anführungszeichen innerhalb der Zeichenfolge zu verarbeiten, oder verwenden die Shell-eigenen Funktionen, um eine Kopie der Zeichenfolge in Anführungszeichen zu erstellen.