Respuestas:
shllama al programa shcomo intérprete y el -cindicador significa ejecutar el siguiente comando tal como lo interpreta este programa.
En Ubuntu, por shlo general está vinculado a /bin/dash, lo que significa que si ejecuta un comando con sh -cel shell del tablero se utilizará para ejecutar el comando en lugar de bash. El shell llamado con shdepende del enlace simbólico; puede averiguarlo con readlink -e $(which sh). Debe usarlo sh -ccuando desee ejecutar un comando específicamente con ese shell en lugar de bash.
También puede usar esta sintaxis (la -cbandera) 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 -co sh -c)
sudo sh -c 'echo "foo" > /home/bar'
escribirá el archivo barque contiene el texto fooque /home/, mientras que sudo echo "foo" > /home/barfalla 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 -cargumento 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 shpueden 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 -cejemplo 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 -cgenera un no-inicio de sesión , no interactiva sesión sh( dashen 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 ~/.bashrcy /etc/bash.bashrcetc. no estarán disponibles en esta sesión ya que no son interactivas . Puede simular un comportamiento de sesiones interactivas (casi), utilizando la -iopció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_profiley ~/.bash_loginno existe) y /etc/profileno 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 -lopció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-cparte deman sh.