Как мне вставить многострочные коды bash в терминал и запустить все сразу?

107

Мне нужно вставить многострочный код bash в терминал, но всякий раз, когда я это делаю, каждая строка запускается как отдельная команда, как только она вставляется.

Натан
источник

Ответы:

111

Попробуйте поставить \в конце каждой строки перед ее копированием.

Пример:

echo "Hello world" && \
script_b.sh

echo $?

Код выхода ( $?) теперь представляет собой полную последовательность команд, а не только последнюю команду.

opsguy
источник
21
Примечание: конечные пробелы сломают его!
Max Reeder
54

Я действительно удивлен, что этого ответа здесь нет, я искал решение этого вопроса и думаю, что это самый простой подход и более гибкий / снисходительный ...

Если вы хотите вставить в bash несколько строк с веб-сайта / текстового редактора и т. Д., Независимо от того, какие это команды на строку, функцию или весь скрипт ... просто начните с (и закончите) и Enter, например в следующем примере:

Если бы у меня был следующий капля

function hello {
    echo Hello!
}
hello

Вы можете вставить и проверить в терминале с помощью bash:

  1. Начиная с (

  2. Вставка текста и нажатие Enter (чтобы было красиво) ... или нет

  3. Заканчиваем с )и нажатием Enter

Пример:

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

Вставленный текст автоматически продолжается с добавлением >к каждой строке. Я тестировал несколько строк с командами на строку, функциями и целыми сценариями. Надеюсь, это поможет другим сэкономить время!

Попробуй снова
источник
4
Самый
1
@Toolkit для простых вещей будет работать так, как вы описали, но решение, которое я предложил, будет работать для более сложных ситуаций (разрывы строк, несколько функций, целые сценарии и т. Д.)
TryTryAgain
1
Это запускает вставленные команды в подоболочке, поэтому часто на самом деле не то, что вы хотите. Вы можете использовать фигурные скобки вместо круглых, чтобы заставить его работать в текущей оболочке; но на самом деле просто не делайте этого. Снаряд справится.
tripleee
33

Если вы нажмете C-x C-eкоманду, которая откроет ваш редактор по умолчанию, который определен .bashrc, после этого вы сможете использовать все мощные функции вашего редактора. Когда вы сохраните и выйдете, линии будут ждать вашего входа.

Если вы хотите определить свой редактор, просто напишите Ex. EDITOR=emacs -nwили EDITOR=viвнутри~/.bashrc

Итиразимвар
источник
2
Этот метод полезен, но учтите, что редактор должен работать синхронно (как emacsи vido), а при сохранении и выходе команды выполняются мгновенно .
mklement0 02
16

Помимо обратной косой черты, если строка заканчивается на |или &&или ||, она будет продолжена на следующей строке.

Гленн Джекман
источник
12

Добавьте круглые скобки вокруг линий. Пример:

$ (
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
источник
2
Обратите внимание, что, как и парантез (, фигурные скобки {будут работать так же в приведенном выше примере
GypsyCosmonaut
2
Кажется, это дублирует предыдущий ответ на этой странице
tripleee
12

Другая возможность:

bash << EOF
echo "Hello"
echo "World"
EOF
Ленар Хойт
источник
4

Чтобы предотвратить появление длинной строки команд в текстовом файле, я сохраняю свои фрагменты кода копирования следующим образом:

echo a;\
echo b;\
echo c
nvd
источник
0

Попробуйте так:

echo $( 
    cmd1
    cmd2
    ...
)
Voltento
источник
0

iTerm отлично справляется с многострочными командами, он сохраняет многострочные команды как одну команду, затем мы можем использовать Cmd+ Shift+ ;для навигации по истории.

Ознакомьтесь с другими советами iTerm в разделе Эффективная работа с iTerm

jeffery.yuan
источник
-1

Пытаться

out=$(cat)

Затем вставьте свои строки и нажмите Ctrl-D (вставьте символ EOF). Весь ввод до Ctrl-D будет перенаправлен на стандартный вывод cat.

sspprroo
источник
попробуйте это: $ out=$(cat) && eval "$out". нажмите Enter после последней строки, затем CTRL + D, как предложено выше.
Мохамед Бана