Jak wkleić wielowierszowe kody bash do terminala i uruchomić je wszystkie naraz?

107

Muszę wkleić wielowierszowy kod bash do terminala, ale za każdym razem, gdy to robię, każda linia jest uruchamiana jako osobne polecenie, gdy tylko zostanie wklejona.

Nathan
źródło

Odpowiedzi:

111

Spróbuj umieścić \na końcu każdego wiersza przed jego skopiowaniem.

Przykład:

echo "Hello world" && \
script_b.sh

echo $?

Kod zakończenia ( $?) to teraz pełna sekwencja poleceń, a nie tylko ostatnie polecenie.

opsguy
źródło
21
Uwaga: końcowe spacje to przerwą!
Max Reeder,
54

Jestem naprawdę zaskoczony, że nie ma tutaj takiej odpowiedzi, szukałem rozwiązania tego pytania i myślę, że to jest najłatwiejsze podejście i bardziej elastyczne / wybaczające ...

Jeśli chcesz wkleić wiele wierszy ze strony internetowej / edytora tekstu / itp. Do basha, niezależnie od tego, czy są to polecenia w wierszu, funkcja czy cały skrypt ... po prostu zacznij od a (i zakończ a )i Enter, na przykład w poniższym przykładzie:

Gdybym miał następujący blob

function hello {
    echo Hello!
}
hello

Możesz wkleić i zweryfikować w terminalu za pomocą basha:

  1. Począwszy od (

  2. Wklejanie tekstu i naciśnięcie Enter (aby był ładny) ... lub nie

  3. Kończąc na a )i naciskając Enter

Przykład:

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

Wklejony tekst jest automatycznie kontynuowany z prependerem >dla każdego wiersza. Testowałem z wieloma wierszami z poleceniami na wiersz, funkcjami i całymi skryptami. Mam nadzieję, że pomoże to innym zaoszczędzić trochę czasu!

TryTryAgain
źródło
4
najłatwiejsza metoda IMO
Hobroker
1
@Toolkit dla prostych rzeczy będzie działać tak, jak opisałeś, ale rozwiązanie, które zaoferowałem, będzie działać w bardziej złożonych sytuacjach (podziały wierszy, wiele funkcji, całe skrypty itp.)
TryTryAgain
1
Powoduje to uruchomienie wklejonych poleceń w podpowłoce, więc często nie robi tego, co chcesz. Możesz użyć nawiasów klamrowych zamiast nawiasów, aby wymusić uruchomienie go w bieżącej powłoce; ale tak naprawdę, po prostu też nie rób. Powłoka może sobie poradzić.
tripleee
34

Jeśli naciśniesz C-x C-epolecenie, które otworzy domyślny edytor, który został zdefiniowany .bashrc, możesz użyć wszystkich zaawansowanych funkcji swojego edytora. Kiedy zapiszesz i wyjdziesz, linie będą czekać na twoje wejście.

Jeśli chcesz zdefiniować swój edytor, po prostu napisz dla Ex. EDITOR=emacs -nwlub EDITOR=viwewnątrz~/.bashrc

itirazimvar
źródło
2
Technika jest przydatna, ale pamiętaj, że edytor musi działać synchronicznie (tak jak emacsi virobią), a po zapisaniu i wyjściu polecenia są wykonywane natychmiast .
mklement0
16

Oprócz odwrotnego ukośnika, jeśli linia kończy się na |lub &&lub ||, będzie kontynuowana w następnej linii.

glenn jackman
źródło
12

Dodaj nawiasy wokół linii. Przykład:

$ (
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
źródło
2
Zauważ, że podobnie jak paranteza (, szelki {również działałyby tak samo w powyższym przykładzie
GypsyCosmonaut
2
Wydaje się, że powiela wcześniejszą odpowiedź na tej stronie
tripleee
12

Inna możliwość:

bash << EOF
echo "Hello"
echo "World"
EOF
Lenar Hoyt
źródło
4

Aby zapobiec tworzeniu długich linii poleceń w pliku tekstowym, zachowuję takie fragmenty kodu kopiowania:

echo a;\
echo b;\
echo c
nvd
źródło
0

Spróbuj w ten sposób:

echo $( 
    cmd1
    cmd2
    ...
)
voltento
źródło
0

iTerm doskonale radzi sobie z poleceniami wielowierszowymi, zapisuje polecenie wielowierszowe jako jedno polecenie, a następnie możemy użyć Cmd+ Shift+ ;do nawigacji po historii.

Sprawdź więcej wskazówek iTerm na temat efektywnej pracy z iTerm

jeffery.yuan
źródło
-1

Próbować

out=$(cat)

Następnie wklej linie i naciśnij Ctrl-D (wstaw znak EOF). Wszystkie dane wejściowe do Ctrl-D zostaną przekierowane na standardowe wyjście kota.

sspprroo
źródło
spróbuj tego: $ out=$(cat) && eval "$out". naciśnij Enter po ostatniej linii, a następnie CTRL + D, jak sugerowano powyżej.
Mohamed Bana