Respuestas:
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
El -c
argumento es:
Lea los comandos del operando command_string en lugar de la entrada estándar. El parámetro especial 0 se establecerá a partir del operando nombre_comando y los parámetros posicionales ($ 1, $ 2, etc.) se establecerán a partir de los operandos de argumento restantes.
Se sh
pueden encontrar otros detalles de las disposiciones ejecutando:
$ man sh
Un ejemplo de uso de una cadena como argumento es:
$ sh -c "echo This is a test string"
Este es un sh -c
ejemplo más detallado . Descargará un documento de Google Drive y lo abrirá para editarlo en el escritorio:
$ sh -c "wget 'https://docs.google.com/document/u/0/d/1jcBtdlMx0f4BhCmAmnIViIy4WN4oRevWFRzse-P00j0/export?format=docx' -O test.docx && xdg-open test.docx 2>/dev/null"
sh -c
genera un no-inicio de sesión , no interactiva sesión sh
( 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:
sh -ic ...
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:
sh -lc ...
Para simular sesiones de inicio de sesión e interactivas:
sh -lic ...
sh -c
? Sería muy bueno si demuestra la asignación de parámetros posicionales que se mencionan en la-c
parte deman sh
.