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 foosh -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'Esto llama
echocon el argumento foo y foo se imprime.Esto invoca el shell con el argumento
echoy proporciona foo como argumento$0. Laechosalida 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 barque generafuente
En este comando:
echoes el binario (o comando incorporado) yfooes el primer argumento.Aquí:
/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 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 wordejecuta 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 fooLa 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