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?
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?
Respuestas:
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.
sh -c 'echo "$@"' fnord a b c d ...
sh -c 'echo $0' foo
no 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'
$ echo foo
foo
Esto llama echo
con el argumento foo y foo se imprime.
$ /bin/sh -c echo foo
Esto invoca el shell con el argumento echo
y proporciona foo como argumento
$0
. La echo
salida 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 bar
que genera
foo
bar
En este comando:
echo foo
echo
es el binario (o comando incorporado) y foo
es el primer argumento.
Aquí:
/bin/sh -c echo foo
/bin/sh
es el binario, cuyo primer argumento es -c
, que acepta una "cadena de comando" como parámetro. Esto está echo
en el ejemplo anterior. Luego hay un tercer argumento: foo
que 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".
La estructura sh -c word
ejecuta 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
En el ejemplo que presenta: /bin/sh -c echo foo
La 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
Mantenga el comando ejecutado como una "palabra" usando comillas.
sh -c 'echo $1' echo foo