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.
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
sh -c? Sería muy bueno si demuestra la asignación de parámetros posicionales que se mencionan en la-cparte deman sh.El
-cargumento es:Se
shpueden encontrar otros detalles de las disposiciones ejecutando:Un ejemplo de uso de una cadena como argumento es:
Este es un
sh -cejemplo más detallado . Descargará un documento de Google Drive y lo abrirá para editarlo en el escritorio:fuente
sh -cgenera un no-inicio de sesión , no interactiva sesiónsh(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: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:Para simular sesiones de inicio de sesión e interactivas:
fuente