Par exemple, alors que cela fonctionne:
$ echo foo foo
Cela ne veut pas:
$ / bin / sh -c echo foo
Alors que cela:
$ / bin / sh -c 'echo foo; écho bar ' foo bar
Y a-t-il une explication?
shell
command-line
arguments
echo
SilverlightFox
la source
la source
sh -c 'echo $1' echo foo
sh -c 'echo "$@"' fnord a b c d ...
sh -c 'echo $0' foo
n'est pas la meilleure option, étant donné que l'interrogateur sait déjà que cela/bin/sh -c 'echo foo; echo bar'
fonctionne, vous pouvez simplement répondre en citant la commande/bin/sh -c 'echo foo'
Ceci appelle
echo
avec l'argument foo et foo est imprimé.Cela invoque le shell avec l'argument
echo
et fournit foo comme argument$0
. Lesecho
sorties une nouvelle ligne et vous jetez le foo . Si vous voulez sortir foo , citez l'argument:ou utilisez l'argument fourni:
Dans cet exemple
Le shell est invoqué avec l'argument
echo foo; echo bar
qui génèrela source
Dans cette commande:
echo
est le binaire (ou la commande intégrée) etfoo
est le premier argument.Ici:
/bin/sh
est le binaire, dont le premier argument est-c
, qui accepte lui-même une "chaîne de commande" comme paramètre. C'estecho
dans l'exemple ci-dessus. Ensuite, il y a un troisième argument:foo
qui est un argument pour/bin/sh
, pas pourecho
. C'est pourquoi dans votre troisième exemple:... les deux sont imprimés. Vous avez cité l'argument. Ainsi: le premier argument est
-c
, et le paramètre de cet argument est'echo foo; echo bar'
qui est interprété entier comme un seul argument; comme "chaîne de commande".la source
La structure
sh -c word
exécute uniquement le mot (dans un shell).Les mots ajoutés signifient d'autres choses, comme l'argument zéro, un, deux, etc.:
pour garder une commande qui a des espaces comme un seul mot, la citation est nécessaire:
ainsi, cela affiche tous les arguments:
Exemples
Dans l'exemple que vous présentez:
/bin/sh -c echo foo
Le premier mot (après les options) estecho
, c'est ce qui est exécuté. Et un écho sans texte imprimera une nouvelle ligne uniquement, rien d'autre:C'est pourquoi vous obtenez une ligne vide.
Si vous citez l'espace, vous exécuterez "un mot" (pas d'espaces), comme ceci:
Conclusion
Conservez la commande exécutée comme un "mot" en utilisant des guillemets.
la source