¿Por qué echo no se llama como / bin / sh -c echo foo output nada?

15

Por ejemplo, mientras esto funciona:

$ echo foo
foo

Esto no:

$ / bin / sh -c echo foo

Mientras que esto hace:

$ / bin / sh -c 'echo foo; barra de eco
foo
bar

¿Hay alguna explicación?

SilverlightFox
fuente

Respuestas:

21

Desde 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 que su comando debería ser así:

 $ sh -c 'echo "$0"' foo 
 foo

Similar:

$ sh -c 'echo "$0 $1"' foo bar
foo bar

Esa fue la primera parte para entender; El segundo caso es simple y no necesita explicación, supongo.

Ijaz Ahmad Khan
fuente
2
Una forma más estricta y estándar seríash -c 'echo $1' echo foo
jlliagre el
1
sh -c 'echo "$@"' fnord a b c d ...
zwol
3
En mi humilde opinión, la explicación fue bastante buena, pero sh -c 'echo $0' foono es la mejor opción, teniendo en cuenta que el interrogador ya sabe que /bin/sh -c 'echo foo; echo bar'funciona, simplemente puede responder citando el comando/bin/sh -c 'echo foo'
X3MBoy
1
@ X3MBoy El interrogador ya sabe que / bin / sh -c 'echo foo' funciona bien. Quería hacer eco de algo fuera de eso, lo cual le expliqué
Ijaz Ahmad Khan el
18
$ echo foo
foo

Esto llama echocon el argumento foo y foo se imprime.

$ /bin/sh -c echo foo

Esto invoca el shell con el argumento echoy proporciona foo como argumento $0. La echosalida de una nueva línea y descarta el foo . Si desea generar foo , cite el argumento:

sh -c 'echo foo'

o use el argumento proporcionado:

sh -c 'echo $0' foo

En este ejemplo

$ /bin/sh -c 'echo foo; echo bar'
foo
bar

El shell se invoca con el argumento echo foo; echo barque genera

foo
bar
Marco
fuente
8

En este comando:

echo foo

echoes el binario (o comando incorporado) y fooes el primer argumento.

Aquí:

/bin/sh -c echo foo

/bin/shes el binario, cuyo primer argumento es -c, que acepta una "cadena de comando" como parámetro. Esto está echoen el ejemplo anterior. Luego hay un tercer argumento: fooque es un argumento para /bin/sh, no para echo. Es por eso que en tu tercer ejemplo:

/bin/sh -c 'echo foo; echo bar'

... ambos están impresos. Citaste el argumento. Así: el primer argumento es -c, y el parámetro para este argumento es el 'echo foo; echo bar'que se interpreta entero como un argumento; como la "cadena de comando".

caos
fuente
3

La estructura sh -c wordejecuta solo palabra (en un shell).
Las palabras agregadas significan otras cosas, como argumento cero, uno, dos, etc.

sh -c word zero one two three

para mantener un comando que tiene espacios como una palabra, se necesita una cita:

sh -c 'echo fnord' zero one two three

entonces, esto imprime todos los argumentos:

$ sh -c 'echo "args=" "$0" "$@"' zero one two three
args = zero one two three

Ejemplos

En el ejemplo que presenta: /bin/sh -c echo fooLa primera palabra (después de las opciones) es echo, eso es lo que se ejecuta. Y un eco sin texto imprimirá una nueva línea solamente, nada más:

$ / bin / sh -c echo foo

Es por eso que obtienes una línea vacía.

Si cita el espacio, ejecutará "una palabra" (sin espacios), así:

$ / bin / sh -c echo \ foo
foo
$ / bin / sh -c "echo foo"
foo
$ / bin / sh -c 'echo foo'
foo

Conclusión

Mantenga el comando ejecutado como una "palabra" usando comillas.


fuente