Como executar um bloco de comando no shell principal? [duplicado]

5

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

                    
por sharkant 22.05.2017 / 17:19

2 respostas

7

Em vez de ( something ) , que lança something em um subshell, use { something ; } , que lança 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

Note, no entanto, que se você iniciar alguns comandos complexos (ou comandos canalizados), eles estarão em uma sub-camada na maioria das vezes.

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

Então, eu escreveria seu teste como:

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

(o sono não é realmente útil de qualquer maneira aqui)

    
por 22.05.2017 / 17:32
10

Depende do que você quer dizer com como um todo .

Se você quer dizer apenas enviar vários comandos para o shell, e certificar-se de que o shell não comece a executá-los até que você tenha digitado todos eles, então você pode simplesmente fazer:

cmd1; cmd2

Ou

cmd1Ctrl+VCtrl+Jcmd2

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

Ou:

{
cmd1
cmd2
}

Para tê-los em várias linhas.

Se você quiser agrupá-los para que eles 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 suas próprias variáveis e escopo de opção, já que bash não tem o equivalente a zsh funções anônimas, você precisaria definir uma função temporária:

f() { local var; var=foo; bar;}; f
    
por 22.05.2017 / 17:58