Como executar um bloco de comando no shell principal?

Como executar um bloco de comando no shell principal?

Tento executar uma série de comandos como um todo dentro do shell principal, mas a maneira como fui ensinado só funciona dentro do subshell:

Responder1

Depende do que você quer dizer comcomo um todo.

Se você quer apenas enviar vários comandos para o shell e garantir que o shell não comece a executá-los até que você insira todos eles, basta fazer:

cmd1; cmd2

Ou

cmd1 Ctrl+VCtrl+Jcmd2

(ou ative a colagem entre colchetes ( bind 'set enable-bracketed-paste on') e cole os comandos de um terminal que suporte a colagem entre colchetes).

Ou:

{
cmd1
cmd2
}

Tê-los em várias linhas.

Se você quiser agrupá-los para que compartilhem o mesmo stdin ou stdout, por exemplo, você pode usar:

{ cmd1; cmd2; } < in > out

Ou

eval 'cmd1; cmd2' < in > out

Se você quiser que eles sejam executados com sua própria variável e escopo de opção, pois bashnão possuem o equivalente a zshfunções anônimas, você precisará definir uma função temporária:

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

Responder2

Em vez de ( something ), que é iniciado somethingem um subshell, use { something ; }, que é iniciado somethingno shell atual

Você precisa de espaços após o {, e também deve ter um ;(ou uma nova linha) antes do }.

Ex:

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

Observe, entretanto, que se você iniciar alguns comandos complexos (ou comandos canalizados), eles estarão em um subshell na maior parte do tempo.

E a maneira "portátil" de obter o pid do seu shell atual é $$.

Então, em vez disso, escreveria seu teste como:

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

(o sono não é realmente útil aqui)

informação relacionada