¿Cómo ejecutar un bloque de comandos en el shell principal?

¿Cómo ejecutar un bloque de comandos en el shell principal?

Intento ejecutar una serie de comandos como un todo dentro del shell principal, pero la forma en que me enseñaron solo funciona dentro del subshell:

Respuesta1

Depende de lo que quieras decir concomo un todo.

Si solo te refieres a enviar varios comandos al shell y asegurarte de que el shell no comience a ejecutarlos hasta que los hayas ingresado todos, entonces puedes hacer:

cmd1; cmd2

O

cmd1 Ctrl+VCtrl+Jcmd2

(o habilite el pegado entre corchetes ( bind 'set enable-bracketed-paste on') y pegue los comandos desde un terminal que admita el pegado entre corchetes).

O:

{
cmd1
cmd2
}

Tenerlos en varias líneas.

Si desea agruparlos para que compartan la misma entrada estándar o salida estándar, por ejemplo, puede usar:

{ cmd1; cmd2; } < in > out

O

eval 'cmd1; cmd2' < in > out

Si desea que se ejecuten con su propia variable y alcance de opción, ya bashque no tienen el equivalente de zshfunciones anónimas, deberá definir una función temporal:

f() { local var; var=foo; bar;}; f

Respuesta2

En lugar de ( something ), que se inicia somethingen un subshell, use { something ; }, que se inicia somethingen el shell actual

Necesita espacios después de {, y también debe tener un ;(o una nueva línea) antes de }.

Ex:

$ { echo "hello $BASHPID";sleep 5;echo "hello again $BASHPID" ; }
hello 3536
hello again 3536

Sin embargo, tenga en cuenta que si ejecuta algunos comandos complejos (o comandos canalizados), de todos modos estarán en un subshell la mayor parte del tiempo.

Y la forma "portátil" de obtener el pid de su shell actual es $$.

Entonces, en lugar de eso, escribiría tu prueba como:

{ echo "hello $$"; sleep 5 ; echo "hello again $$" ; }

(dormir no es realmente útil aquí de todos modos)

información relacionada