Comment coller des codes bash multilignes dans le terminal et tout exécuter en même temps?

104

J'ai besoin de coller un code bash multi-lignes dans le terminal, mais chaque fois que je le fais, chaque ligne est exécutée en tant que commande séparée dès qu'elle est collée.

Nathan
la source

Réponses:

107

Essayez de mettre \à la fin de chaque ligne avant de la copier.

opsguy
la source
19
Remarque: les espaces de fin le briseront!
Max Reeder
55

Je suis vraiment surpris que cette réponse ne soit pas proposée ici, j'étais à la recherche d'une solution à cette question et je pense que c'est l'approche la plus simple, et la plus flexible / indulgente ...

Si vous souhaitez coller plusieurs lignes d'un site Web / éditeur de texte / etc., dans bash, qu'il s'agisse de commandes par ligne ou d'une fonction ou d'un script entier ... commencez simplement par un (et terminez par un )et Entrée, comme dans l'exemple suivant:

Si j'avais le blob suivant

function hello {
    echo Hello!
}
hello

Vous pouvez coller et vérifier dans un terminal à l'aide de bash en:

  1. Commençant par (

  2. Coller votre texte et appuyer sur Entrée (pour le rendre joli) ... ou pas

  3. Terminer par un )et appuyer sur Entrée

Exemple:

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

Le texte collé se poursuit automatiquement avec un préfixe >pour chaque ligne. J'ai testé avec plusieurs lignes avec des commandes par ligne, des fonctions et des scripts entiers. J'espère que cela aidera les autres à gagner du temps!

TryTryAgain
la source
4
méthode la plus simple IMO
Hobroker
1
@Toolkit pour les choses simples, cela fonctionnera comme vous l'avez décrit, mais la solution que j'ai proposée fonctionnera pour des situations plus complexes (sauts de ligne, fonctions multiples, scripts entiers, etc.)
TryTryAgain
1
Cela exécute les commandes collées dans un sous-shell, donc il ne fait souvent pas ce que vous voulez. Vous pouvez utiliser des accolades au lieu de parenthèses pour le forcer à s'exécuter dans le shell actuel; mais vraiment, ne faites pas non plus. La coquille peut faire face.
tripleee
33

Si vous appuyez sur la C-x C-ecommande qui ouvrira votre éditeur par défaut qui a défini .bashrc, vous pourrez ensuite utiliser toutes les fonctionnalités puissantes de votre éditeur. Lorsque vous enregistrez et quittez, les lignes attendront votre entrée.

Si vous souhaitez définir votre éditeur, écrivez simplement pour Ex. EDITOR=emacs -nwou à l' EDITOR=viintérieur de~/.bashrc

itirazimvar
la source
2
La technique est utile, mais notez que l'éditeur doit s'exécuter de manière synchrone (comme emacset vifaire), et lors de l'enregistrement et de la sortie, les commandes sont exécutées instantanément .
mklement0
16

En plus de la barre oblique inverse, si une ligne se termine par |ou &&ou ||, elle se poursuivra sur la ligne suivante.

Glenn Jackman
la source
13

Ajoutez des parenthèses autour des lignes. Exemple:

$ (
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
la source
2
Notez que, comme la paranthèse (, les accolades {fonctionneraient également de la même manière dans l'exemple ci-dessus
GypsyCosmonaut
2
Cela semble dupliquer une réponse précédente sur cette page
tripleee
12

Une autre possibilité:

bash << EOF
echo "Hello"
echo "World"
EOF
Lenar Hoyt
la source
4

Pour éviter une longue ligne de commandes dans un fichier texte, je garde mes extraits de code de copie comme ceci:

echo a;\
echo b;\
echo c
nvd
la source
0

Essayez de cette façon:

echo $( 
    cmd1
    cmd2
    ...
)
Voltento
la source
0

iTerm gère parfaitement les commandes sur plusieurs lignes, il enregistre les commandes sur plusieurs lignes en une seule commande, puis nous pouvons utiliser Cmd+ Shift+ ;pour naviguer dans l'historique.

Consultez plus de conseils iTerm sur Travailler efficacement avec iTerm

jeffery.yuan
la source
-1

Essayer

out=$(cat)

Collez ensuite vos lignes et appuyez sur Ctrl-D (insérer le caractère EOF). Toutes les entrées jusqu'à Ctrl-D seront redirigées vers la sortie standard de cat.

sspprroo
la source
essayez ceci: $ out=$(cat) && eval "$out". appuyez sur Entrée après la dernière ligne, puis CTRL + D comme suggéré ci-dessus.
Mohamed Bana