Come incollo i codici bash multilinea nel terminale ed eseguirli tutto in una volta?


104

Devo incollare un codice bash su più righe nel terminale, ma ogni volta che lo faccio, ogni riga viene eseguita come comando separato non appena viene incollata.

Risposte:


107

Prova a metterla \alla fine di ogni riga prima di copiarla.


19
Nota: gli spazi finali lo romperanno!
Max Reeder

55

Sono davvero sorpreso che questa risposta non sia offerta qui, ero alla ricerca di una soluzione a questa domanda e penso che questo sia l'approccio più semplice e più flessibile / indulgente ...

Se desideri incollare più righe da un sito Web / editor di testo / ecc., In bash, indipendentemente dal fatto che si tratti di comandi per riga o di una funzione o dell'intero script ... inizia semplicemente con a (e termina con a )e Invio, come nell'esempio seguente:

Se avessi il seguente blob

function hello {
    echo Hello!
}
hello

Puoi incollare e verificare in un terminale usando bash:

  1. Iniziare con (

  2. Incollare il testo e premere Invio (per renderlo carino) ... oppure no

  3. Finendo con a )e premendo Invio

Esempio:

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

Il testo incollato continua automaticamente con un anteposto >per ogni riga. Ho testato con più righe con comandi per riga, funzioni e interi script. Spero che questo aiuti gli altri a risparmiare tempo!


4
metodo più semplice IMO
Hobroker

1
@Toolkit per le cose semplici funzionerà come hai descritto, ma la soluzione che ho offerto funzionerà per situazioni più complesse (interruzioni di riga, più funzioni, interi script, ecc.)
TryTryAgain

1
Questo esegue i comandi incollati in una subshell, quindi spesso non fa quello che vuoi. Puoi usare le parentesi graffe invece delle parentesi per forzare l'esecuzione nella shell corrente; ma davvero, non farlo neanche. Il guscio può farcela.
tripleee

33

Se premi il C-x C-ecomando che aprirà il tuo editor predefinito che è stato definito .bashrc, dopodiché potrai utilizzare tutte le potenti funzionalità del tuo editor. Quando salvi ed esci, le linee aspetteranno il tuo ingresso.

Se vuoi definire il tuo editor, scrivi semplicemente per Ex. EDITOR=emacs -nwo EDITOR=viall'interno di~/.bashrc


2
La tecnica è utile, ma si noti che l'editor deve essere eseguito in modo sincrono (come emacse vifare) e al salvataggio e all'uscita i comandi vengono eseguiti immediatamente .
mklement0

16

Oltre alla barra rovesciata, se una riga termina con |o &&o ||, verrà continuata sulla riga successiva.


13

Aggiungi parentesi attorno alle linee. Esempio:

$ (
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
)

2
Nota, come la parantesi (, anche le parentesi graffe {funzionerebbero allo stesso modo nell'esempio sopra
GypsyCosmonaut


12

Un'altra possibilità:

bash << EOF
echo "Hello"
echo "World"
EOF

4

Per evitare una lunga riga di comandi in un file di testo, conservo i miei frammenti di copia-passo in questo modo:

echo a;\
echo b;\
echo c


0

iTerm gestisce perfettamente il comando su più righe, salva il comando su più righe come un comando, quindi possiamo usare Cmd+ Shift+ ;per navigare nella cronologia.

Controlla altri suggerimenti su iTerm in Lavorare efficacemente con iTerm


-1

Provare

out=$(cat)

Quindi incolla le linee e premi Ctrl-D (inserisci il carattere EOF). Tutti gli input fino a Ctrl-D verranno reindirizzati allo stdout di cat.


provare questo: $ out=$(cat) && eval "$out". premi invio dopo l'ultima riga, quindi CTRL + D come suggerito sopra.
Mohamed Bana
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.