Descubrí el sh -c
comando. Lo encontré antes de publicar aquí, pero no puedo encontrar ninguna publicación de Google que lo explique, así que me gustaría saber qué es y cuál es su sintaxis completa.
sh
llama al programa sh
como intérprete y el -c
indicador significa ejecutar el siguiente comando tal como lo interpreta este programa.
En Ubuntu, por sh
lo general está vinculado a /bin/dash
, lo que significa que si ejecuta un comando con sh -c
el shell del tablero se utilizará para ejecutar el comando en lugar de bash. El shell llamado con sh
depende del enlace simbólico; puede averiguarlo con readlink -e $(which sh)
. Debe usarlo sh -c
cuando desee ejecutar un comando específicamente con ese shell en lugar de bash.
También puede usar esta sintaxis (la -c
bandera) con otros intérpretes. Un uso clásico de él (señalado por @edwinksl es evitar el problema de la redirección que no funciona con sudo (aquí podría usar bash -c
o sh -c
)
sudo sh -c 'echo "foo" > /home/bar'
escribirá el archivo bar
que contiene el texto foo
que /home/
, mientras que sudo echo "foo" > /home/bar
falla como se explica muy bien aquí
Es importante usar 'comillas simples' alrededor de la cadena de comando; de lo contrario, el shell actual intentará expandirla antes de pasarla al intérprete al que llamó
por ejemplo (con python hasta que piense en un comando que daría resultados diferentes en el guión ...)
$ python3 -c print (35/7)
bash: syntax error near unexpected token `('
$ python3 -c 'print (35/7)'
5.0
sh -c
? Sería muy bueno si demuestra la asignación de parámetros posicionales que se mencionan en la-c
parte deman sh
.El
-c
argumento es:Se
sh
pueden encontrar otros detalles de las disposiciones ejecutando:Un ejemplo de uso de una cadena como argumento es:
Este es un
sh -c
ejemplo más detallado . Descargará un documento de Google Drive y lo abrirá para editarlo en el escritorio:fuente
sh -c
genera un no-inicio de sesión , no interactiva sesiónsh
(dash
en Ubuntu).El siguiente comando que se ejecuta en esa sesión de terminal, que será tratado como argumento (parámetro de posición) 0 (
ARGV0
), y la parte restante como el argumento a ese comando (ARGV0
), a partir de 1 (ARGV1
,ARGV2
, ...).También puede usar características típicas de shell que se pueden ejecutar en este tipo de sesión, por ejemplo, separación de comandos usando
;
para usar múltiples comandos, agrupación de comandos usando{}
, generar otra subshell con()
, y así sucesivamente. El uso de estos puede cambiar ligeramente las definiciones de argumentos / ejemplos mencionados anteriormente.Solo para tener en cuenta, las características que son específicas solo para shells interactivas (por defecto), por ejemplo, expansión de historial,
source
-ing~/.bashrc
y/etc/bash.bashrc
etc. no estarán disponibles en esta sesión ya que no son interactivas . Puede simular un comportamiento de sesiones interactivas (casi), utilizando la-i
opción:Del mismo modo, las características que son específicas de los shells de inicio de sesión únicamente (por defecto), por ejemplo,
source
-ing of~/.profile
(dado~/.bash_profile
y~/.bash_login
no existe) y/etc/profile
no se realizarán ya que el shell es un shell sin inicio de sesión . Puede simular el comportamiento de los shells de inicio de sesión con la-l
opción:Para simular sesiones de inicio de sesión e interactivas:
fuente