Perché l'eco non viene chiamato come / bin / sh -c echo foo output?


15

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:


21

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.


2
Un modo più rigoroso e conforme standard sarebbesh -c 'echo $1' echo foo
jlliagre,

1
sh -c 'echo "$@"' fnord a b c d ...
zwol,

3
IMHO la spiegazione è stata abbastanza buona, ma 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'
X3MBoy

1
@ X3MBoy L'interrogante sa già che / bin / sh -c 'echo foo' funziona bene. Voleva echeggiare qualcosa al di fuori di quello, che ho spiegato
Ijaz Ahmad Khan,

18
$ 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

8

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".


3

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

Esempi

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

Conclusione

Mantenere il comando eseguito come una "parola" usando le virgolette.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.