Como colo códigos bash de várias linhas no terminal e executo tudo de uma vez?

102

Preciso colar um código bash de várias linhas no terminal, mas sempre que o faço, cada linha é executada como um comando separado assim que é colada.

Nathan
fonte

Respostas:

104

Experimente colocar \no final de cada linha antes de copiá-la.

opsguy
fonte
18
Nota: espaços à direita irão quebrá-lo!
Max Reeder
53

Estou realmente surpreso que essa resposta não seja oferecida aqui, eu estava em busca de uma solução para essa questão e acho que essa é a abordagem mais fácil, e mais flexível / perdoadora ...

Se você gostaria de colar várias linhas de um site / editor de texto / etc., No bash, independentemente de se tratar de comandos por linha, função ou script inteiro ... simplesmente comece com a (e termine com a )e Enter, como no seguinte exemplo:

Se eu tivesse o seguinte blob

function hello {
    echo Hello!
}
hello

Você pode colar e verificar em um terminal usando o bash:

  1. Começando com (

  2. Colando seu texto e pressionando Enter (para torná-lo bonito) ... ou não

  3. Terminando com a )e pressionando Enter

Exemplo:

imac:~ home$ ( function hello {
>     echo Hello!
> }
> hello
> )
Hello!
imac:~ home$ 

O texto colado continua automaticamente com um prefixo >para cada linha. Eu testei várias linhas com comandos por linha, funções e scripts inteiros. Espero que isso ajude outras pessoas a economizar tempo!

Try TryAgain
fonte
4
método mais fácil IMO
Hobroker
1
@Toolkit para as coisas simples, ele funcionará como você descreveu, mas a solução que ofereci funcionará para situações mais complexas (quebras de linha, funções múltiplas, scripts inteiros, etc.)
Try TryAgain
1
Isso executa os comandos colados em um subshell, portanto, geralmente não faz o que você deseja. Você pode usar colchetes em vez de parênteses para forçar a execução no shell atual; mas realmente, simplesmente não faça nada. A concha aguenta.
tripleee
33

Se você pressionar o C-x C-ecomando que irá abrir o seu editor padrão que o definiu .bashrc, depois disso você pode usar todos os recursos poderosos do seu editor. Quando você salvar e sair, as linhas aguardarão sua entrada.

Se você quiser definir seu editor, basta escrever para Ex. EDITOR=emacs -nwou EDITOR=videntro de~/.bashrc

Itirazimvar
fonte
2
A técnica é útil, mas observe que o editor deve ser executado de forma síncrona (como emacse vifazer) e, ao salvar e sair, os comandos são executados instantaneamente .
mklement0
16

Além da barra invertida, se uma linha terminar com |ou &&ou ||, ela continuará na próxima linha.

glenn jackman
fonte
13

Adicione parênteses ao redor das linhas. Exemplo:

$ (
sudo apt-get update
dokku apps
dokku ps:stop APP # repeat to shut down each running app
sudo apt-get install -qq -y dokku herokuish sshcommand plugn
dokku ps:rebuildall # rebuilds all applications
)
Abrkn
fonte
2
Do nota, como parêntese (, os aparelhos {também funcionam da mesma forma, no exemplo acima
GypsyCosmonaut
2
Isso parece duplicar uma resposta anterior nesta página
tripleee
12

Outra possibilidade:

bash << EOF
echo "Hello"
echo "World"
EOF
Lenar Hoyt
fonte
4

Para evitar uma longa linha de comandos em um arquivo de texto, mantenho meus snippets copy-pase assim:

echo a;\
echo b;\
echo c
nvd
fonte
0

Tente desta forma:

echo $( 
    cmd1
    cmd2
    ...
)
voltento
fonte
0

O iTerm lida perfeitamente com comandos de várias linhas, salva o comando de várias linhas como um comando, então podemos usar Cmd+ Shift+ ;para navegar no histórico.

Verifique mais dicas do iTerm em Trabalhar de forma eficaz com o iTerm

jeffery.yuan
fonte
-1

Experimentar

out=$(cat)

Em seguida, cole suas linhas e pressione Ctrl-D (inserir o caractere EOF). Todas as entradas até Ctrl-D serão redirecionadas para stdout do gato.

sspprroo
fonte
tente o seguinte: $ out=$(cat) && eval "$out". pressione Enter após a última linha e depois CTRL + D como sugerido acima.
Mohamed Bana