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' 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'
$ 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
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".
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
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
Mantenga el comando ejecutado como una "palabra" usando comillas.
sh -c 'echo $1' echo foo