¿Cuál es el comando sh -c?


31

Descubrí el sh -ccomando. 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.

Respuestas:


34

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

¿Puedes dar un ejemplo de cómo usarlo sh -c? Sería muy bueno si demuestra la asignación de parámetros posicionales que se mencionan en la -cparte de man sh.
edwinksl

15

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"

11

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 ...

+1 "sh -c genera una sesión de sh no interactiva y sin inicio de sesión"
JSON C11
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.