Ad esempio, mentre funziona:
$ echo foo foo
Questo non:
$ / bin / sh -c echo foo
Considerando che questo fa:
$ / bin / sh -c 'echo foo; echo bar " foo bar
C'è una spiegazione?
Ad esempio, mentre funziona:
$ echo foo foo
Questo non:
$ / bin / sh -c echo foo
Considerando che questo fa:
$ / bin / sh -c 'echo foo; echo bar " foo bar
C'è una spiegazione?
Risposte:
A partire dal man sh
-c string If the -c option is present, then commands are read from string.
If there are arguments after the string, they are assigned to the
positional parameters, starting with $0
Significa che il tuo comando dovrebbe essere così:
$ sh -c 'echo "$0"' foo
foo
Allo stesso modo:
$ sh -c 'echo "$0 $1"' foo bar
foo bar
Questa è stata la prima parte da capire; il secondo caso è semplice e non ha bisogno di spiegazioni, immagino.
sh -c 'echo "$@"' fnord a b c d ...
sh -c 'echo $0' foonon è l'opzione migliore, considerando che l'interrogante già sa che /bin/sh -c 'echo foo; echo bar'funziona, puoi semplicemente rispondere citando il comando/bin/sh -c 'echo foo'
$ echo foo
foo
Questo chiama echocon l'argomento foo e foo viene stampato.
$ /bin/sh -c echo foo
Questo invoca la shell con l'argomento echoe fornisce foo come argomento
$0. La echoemette una nuova linea e scartare il foo . Se si desidera produrre foo , citare l'argomento:
sh -c 'echo foo'
o usa l'argomento fornito:
sh -c 'echo $0' foo
In questo esempio
$ /bin/sh -c 'echo foo; echo bar'
foo
bar
La shell viene invocata con l'argomento echo foo; echo barche genera
foo
bar
In questo comando:
echo foo
echoè il binario (o comando incorporato) ed fooè il primo argomento.
Qui:
/bin/sh -c echo foo
/bin/shè il binario, il cui primo argomento è -c, che a sua volta accetta una "stringa di comando" come parametro. Questo è echonell'esempio sopra. Quindi c'è un terzo argomento: fooche è un argomento per /bin/sh, non per echo. Ecco perché nel tuo terzo esempio:
/bin/sh -c 'echo foo; echo bar'
... entrambi sono stampati. Hai citato l'argomento. Quindi: il primo argomento è -c, e il parametro di questo argomento è 'echo foo; echo bar'che viene interpretato intero come un argomento; come "stringa di comando".
La struttura sh -c wordesegue solo una parola (in una shell).
Le parole aggiunte significano altre cose, come argomento zero, uno, due, ecc .:
sh -c word zero one two three
per mantenere un comando che ha spazi come una sola parola, è necessario citare:
sh -c 'echo fnord' zero one two three
quindi, questo stampa tutti gli argomenti:
$ sh -c 'echo "args=" "$0" "$@"' zero one two three
args = zero one two three
Nell'esempio che presenti: /bin/sh -c echo foola prima parola (dopo le opzioni) è echo, cioè ciò che viene eseguito. E un'eco senza testo stamperà solo una nuova riga, nient'altro:
$ / bin / sh -c echo foo
Ecco perché ottieni una riga vuota.
Se citi lo spazio, eseguirai "una parola" (senza spazi), in quanto:
$ / bin / sh -c echo \ foo foo $ / bin / sh -c "echo foo" foo $ / bin / sh -c 'echo foo' foo
Mantenere il comando eseguito come una "parola" usando le virgolette.
sh -c 'echo $1' echo foo