Eh bien, se "$@"
développe à la liste des paramètres de position, un argument par paramètre de position.
Quand vous faites:
set '' 'foo bar' $'blah\nblah'
cmd "$@"
cmd
est invoqué avec ces 3 arguments: la chaîne vide, foo bar
et blah<newline>blah
. Le shell appellera l' execve()
appel système avec quelque chose comme:
execve("/path/to/cmd", ["cmd", "", "foo bar", "blah\nblah"], [envvars...]);
Si vous voulez reconstruire une ligne de commande shell (c'est-à-dire du code dans le langage shell) qui reproduirait cette même invocation, vous pourriez faire quelque chose comme:
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 "$@"
Ou avec zsh
, en demandant différents types de devis:
$ 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'
Ou avec zsh
, bash
ou ksh93
(ici pour bash
, YMMV avec d'autres coques):
$ set '' 'foo bar' $'blah\nblah'
$ printf cmd; printf ' %q' "$@"; printf '\n'
cmd '' foo\ bar $'blah\nblah'
Vous pouvez également utiliser l'option xtrace du shell qui oblige le shell à imprimer ce qu'il va exécuter:
$ (PS4=; set -x; : cmd "$@")
: cmd '' 'foo bar' 'blah
blah'
Ci-dessus, nous avons exécuté la :
commande no-op avec cmd
et les paramètres positionnels comme argument. Ma coquille les a imprimés d'une belle façon citée appropriée pour être réintroduite dans la coquille. Tous les obus ne font pas ça.
$
extensions et autres guillemets doubles. C'est pourquoi les autres réponses utilisent des guillemets simples tout en allant à certaines longueurs pour gérer les guillemets simples à l' intérieur de la chaîne, ou utilisent les propres fonctionnalités du shell pour produire une copie entre guillemets de la chaîne.