¿Cuál es la ventaja de usar bash -c sobre el uso de una cadena here?

11

¿Hay algún beneficio real al usar en bash -c 'some command'exceso?bash <<< 'some command'

Parecen lograr el mismo efecto.

Yosefrow
fuente
Hola @Patrick, gracias por el aviso. Realmente no estaba seguro de dónde estaba el mejor lugar para publicar. Dado que, por un lado, esta es una pregunta de Linux, pero por otro lado bash es un tipo de lenguaje de script y el otro sitio tiene más visitantes. En un caso como este, ¿dónde sería el lugar más apropiado para publicar?
yosefrow
44
@yosefrow: Cualquiera de los sitios hubiera estado bien en mi humilde opinión; pero la publicación cruzada es desagradable (le está pidiendo a la gente en ambos sitios que dediquen tiempo a su pregunta, sin darles el beneficio de las respuestas de los demás).
ruakh
¿Sería apropiado eliminar la publicación de uno de los sitios?
yosefrow
2
Otra diferencia menor es que bash -c '...'funcionará en proyectiles que no tienen herejes. Asume que bash se llamará dentro de un shell de bash, pero este no siempre será el caso.
Joel Cornett

Respuestas:

21

bash -c 'some command'retiene el acceso a la entrada estándar de la persona que llama, por lo que los readcomandos de lectura desde la entrada estándar funcionarán normalmente. bash <<< 'some command'sustituye esa entrada con la línea que se pasa en, por lo que bash -c caty bash <<< cathacer cosas diferentes.

$ bash -c cat
abc
abc
^D
$ bash <<< cat
$

Por otro lado, puede utilizar esa función para proporcionar su propia entrada estándar para utilizarla $'...', si tiene mucho cuidado:

$ bash <<< $'read x y\nabc def ghi\necho $y'
def ghi
$

No me gustaría confiar en eso, pero a veces podría ser conveniente.


bash -ctambién permite que los argumentos se pasen al script y $0se establezcan:

bash -c 'some command' sh abc def

se establecerá $1en abcy $2para defadentro some command.

Michael Homer
fuente
3
Los errores de sintaxis también producirán una redacción ligeramente diferente. Principalmente los bash -cque mencionan -c, AFAIK. No del todo inútil, ya que eso puede ayudar a localizarlos. bash <<< 'script'los errores se parecen a los del script principal; bash -c 'script'los que no. Incluso puede etiquetarlos: bash -c 'script' label.
derobert
Bueno, bash <<< 'echo $1' /dev/stdin footambién funciona, y grabados foo. Aunque la configuración $0es algo más limitada.
ilkkachu
bash <<< 'echo "$1"' /dev/stdin foono siempre funciona Me puse bash <<< 'echo "$1"' -s fooa trabajar.
G-Man dice 'reinstalar a Monica' el