![¿Cómo ejecutar un bloque de comandos en el shell principal?](https://rvso.com/image/112008/%C2%BFC%C3%B3mo%20ejecutar%20un%20bloque%20de%20comandos%20en%20el%20shell%20principal%3F%20.png)
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 bash
que no tienen el equivalente de zsh
funciones anónimas, deberá definir una función temporal:
f() { local var; var=foo; bar;}; f
Respuesta2
En lugar de ( something )
, que se inicia something
en un subshell, use { something ; }
, que se inicia something
en 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)