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

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

🌐 echo $BASHPID 18884 🌐 (echo "hello $BASHPID";sleep 5;echo "hello again $BASHPID") hello 22268 hello again 22268 

También probé:

 . (echo "hello $BASHPID";sleep 5;echo "hello again $BASHPID") source (echo "hello $BASHPID";sleep 5;echo "hello again $BASHPID") 

para usar el command de origen, porque aprendí que obliga al script a ejecutarse dentro del shell principal.

Supongo que funcionaría si coloco los commands dentro de un file y lo ejecuto con el command de origen, pero me gustaría saber si hay alguna manera de crear un file de script.

Solutions Collecting From Web of "¿Cómo ejecutar un bloque de commands en el shell principal?"

En lugar de ( something ) , que lanza something en una subshell, usa { something ; } { something ; } , que lanza something en el shell actual

Necesita espacios después del { , 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 count que si ejecuta algunos commands complejos (o commands intercalados), de todos modos estarán en una subcasela la mayor parte del time.

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

Entonces, en su lugar, escribiría su testing como:

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

(el sueño no es realmente útil de todos modos aquí)

Depende de lo que quieras decir como un todo .

Si solo quiere decir enviar varios commands al intérprete de commands y asegurarse de que el intérprete de commands no los ejecuta hasta que no los haya ingresado todos, puede hacer lo siguiente:

 cmd1; cmd2 

O

  cmd1 Ctrl + V Ctrl + J cmd2 

(o habilite la palabra entre corchetes y pegue ( bind 'set enable-bracketed-paste on' ) y pegue los commands de un terminal que admita el corchete de pegar).

O:

 { cmd1 cmd2 } 

Para tenerlos en varias líneas.

Si desea agruparlos para que compartan el mismo stdin o stdout, por ejemplo, puede usar:

 { cmd1; cmd2; } < in > out 

O

 eval 'cmd1; cmd2' < in > out 

Si desea que se ejecuten con su propia variable y ámbito de opción, ya que bash no tiene el equivalente de las funciones anónimas de zsh , deberá definir una function temporal:

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