¿Cómo pego códigos bash de varias líneas en la terminal y los ejecuto todos a la vez?

104

Necesito pegar un código bash de varias líneas en la terminal, pero siempre que lo hago, cada línea se ejecuta como un comando separado tan pronto como se pega.

Nathan
fuente

Respuestas:

107

Intente poner \al final de cada línea antes de copiarlo.

opsguy
fuente
19
Nota: ¡los espacios finales lo romperán!
Max Reeder
55

Estoy realmente sorprendido de que esta respuesta no se ofrezca aquí, estaba buscando una solución a esta pregunta y creo que este es el enfoque más fácil y más flexible / indulgente ...

Si desea pegar varias líneas de un sitio web / editor de texto / etc., en bash, independientemente de si se trata de comandos por línea o una función o un script completo ... simplemente comience con ay (termine con )ay Enter, como en el siguiente ejemplo:

Si tuviera la siguiente mancha

function hello {
    echo Hello!
}
hello

Puede pegar y verificar en una terminal usando bash de la siguiente manera:

  1. Empezando con (

  2. Pegar su texto y presionar Enter (para hacerlo bonito) ... o no

  3. Terminando con a )y presionando Enter

Ejemplo:

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

El texto pegado continúa automáticamente con un prefijo >para cada línea. He probado con múltiples líneas con comandos por línea, funciones y scripts completos. ¡Espero que esto ayude a otros a ahorrar tiempo!

Probar de nuevo
fuente
4
método más fácil OMI
Hobroker
1
@Toolkit por las cosas simples que funcionará como usted la describe, pero la solución que yo he ofrecido trabajará para situaciones más complejas (saltos de línea, múltiples funciones, scripts enteros, etc.)
TryTryAgain
1
Esto ejecuta los comandos pegados en una subcapa, por lo que a menudo no hace lo que desea. Puede usar llaves en lugar de paréntesis para forzar su ejecución en el shell actual; pero en realidad, tampoco lo hagas. El caparazón puede hacer frente.
tripleee
33

Si presiona el C-x C-ecomando que abrirá su editor predeterminado que definió .bashrc, después de eso, puede usar todas las funciones poderosas de su editor. Cuando guarde y salga, las líneas esperarán su entrada.

Si desea definir su editor, simplemente escriba para Ex. EDITOR=emacs -nwo EDITOR=videntro de~/.bashrc

itirazimvar
fuente
2
La técnica es útil, pero tenga en cuenta que el editor debe ejecutarse sincrónicamente (como emacsy vihacer), y al guardar y salir los comandos se ejecutan instantáneamente .
mklement0
16

Además de barra inversa, si una línea termina con |o &&o ||, se continuará en la línea siguiente.

Glenn Jackman
fuente
13

Agrega paréntesis alrededor de las líneas. Ejemplo:

$ (
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
fuente
2
Tenga en cuenta que, al igual que la parántesis (, los frenos {también funcionarían igual en el ejemplo anterior
GypsyCosmonaut
2
Esto parece duplicar una respuesta anterior en esta página
triplicado
12

Otra posibilidad:

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

Para evitar una larga línea de comandos en un archivo de texto, mantengo mis fragmentos de copia-pase como este:

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

Prueba de esta manera:

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

iTerm maneja el comando de múltiples líneas perfectamente, guarda el comando de múltiples líneas como un solo comando, luego podemos usar Cmd+ Shift+ ;para navegar por el historial.

Consulte más consejos sobre iTerm en Trabajar eficazmente con iTerm

jeffery.yuan
fuente
-1

Tratar

out=$(cat)

Luego pegue sus líneas y presione Ctrl-D (inserte el carácter EOF). Toda la entrada hasta Ctrl-D será redirigida a la salida estándar del gato.

sspprroo
fuente
intente lo siguiente: $ out=$(cat) && eval "$out". presione enter después de la última línea y luego CTRL + D como se sugirió anteriormente.
Mohamed Bana