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' foo
non è 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 echo
con l'argomento foo e foo viene stampato.
$ /bin/sh -c echo foo
Questo invoca la shell con l'argomento echo
e fornisce foo come argomento
$0
. La echo
emette 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 bar
che 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 è echo
nell'esempio sopra. Quindi c'è un terzo argomento: foo
che è 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 word
esegue 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 foo
la 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