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?
shell
command-line
arguments
echo
SilverlightFox
fuente
fuente
sh -c 'echo $1' echo foo
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'
Esto llama
echo
con el argumento foo y foo se imprime.Esto invoca el shell con el argumento
echo
y proporciona foo como argumento$0
. Laecho
salida de una nueva línea y descarta el foo . Si desea generar foo , cite el argumento:o use el argumento proporcionado:
En este ejemplo
El shell se invoca con el argumento
echo foo; echo bar
que generafuente
En este comando:
echo
es el binario (o comando incorporado) yfoo
es el primer argumento.Aquí:
/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 paraecho
. Es por eso que en tu tercer ejemplo:... 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".fuente
La estructura
sh -c word
ejecuta solo palabra (en un shell).Las palabras agregadas significan otras cosas, como argumento cero, uno, dos, etc.
para mantener un comando que tiene espacios como una palabra, se necesita una cita:
entonces, esto imprime todos los argumentos:
Ejemplos
En el ejemplo que presenta:
/bin/sh -c echo foo
La primera palabra (después de las opciones) esecho
, eso es lo que se ejecuta. Y un eco sin texto imprimirá una nueva línea solamente, nada más:Es por eso que obtienes una línea vacía.
Si cita el espacio, ejecutará "una palabra" (sin espacios), así:
Conclusión
Mantenga el comando ejecutado como una "palabra" usando comillas.
fuente