![Como executar um bloco de comando no shell principal?](https://rvso.com/image/112008/Como%20executar%20um%20bloco%20de%20comando%20no%20shell%20principal%3F%20.png)
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 bash
não possuem o equivalente a zsh
funçõ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 something
em um subshell, use { something ; }
, que é iniciado something
no 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)