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

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


person Nathan    schedule 15.07.2011    source источник


Ответы (11)


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

Пример:

echo "Hello world" && \
script_b.sh

echo $?

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

person opsguy    schedule 15.07.2011
comment
Примечание: конечные пробелы сломают его! - person Max Reeder; 08.06.2018

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

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

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

function hello {
    echo Hello!
}
hello

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

  1. Начиная с (

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

  3. Конец с ) и нажатие Enter

Пример:

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

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

person TryTryAgain    schedule 02.04.2017
comment
самый простой способ имхо - person Hobroker; 25.06.2017
comment
@Toolkit для простых вещей, он будет работать так, как вы описали, но предложенное мной решение будет работать для более сложных ситуаций (разрывы строк, несколько функций, целые сценарии и т. д.) - person TryTryAgain; 09.01.2018
comment
Это запускает вставленные команды в подоболочке, поэтому на самом деле это часто не делает то, что вы хотите. Вы можете использовать фигурные скобки вместо круглых, чтобы заставить его работать в текущей оболочке; но на самом деле, просто не делайте ни того, ни другого. Оболочка справится. - person tripleee; 31.01.2018

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

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

person itirazimvar    schedule 10.10.2015
comment
Этот прием полезен, но учтите, что редактор должен работать синхронно (как это делают emacs и vi), а при сохранении и выходе команды выполняются мгновенно. - person mklement0; 02.04.2017

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

person glenn jackman    schedule 16.07.2011

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

$ (
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
)
person abrkn    schedule 02.05.2017
comment
Обратите внимание, как скобки (, фигурные скобки { также будут работать так же в приведенном выше примере. - person GypsyCosmonaut; 16.07.2017
comment
Кажется, это дублирует более ранний ответ на этой странице - person tripleee; 31.01.2018

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

bash << EOF
echo "Hello"
echo "World"
EOF
person Lenar Hoyt    schedule 15.10.2018

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

echo a;\
echo b;\
echo c
person nvd    schedule 14.05.2014
comment
Этот ответ, по-видимому, соответствует принятому ответу только с 2 символами вместо 3 (&&). Почему принятый ответ настолько предпочтительнее? - person al-ash; 19.11.2020

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

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

person jeffery.yuan    schedule 21.06.2018

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

echo $( 
    cmd1
    cmd2
    ...
)
person voltento    schedule 09.02.2018

В моей оболочке установлены привязки клавиш vi. Я не помню, навскидку, как я это настроил. Но при вводе команды я могу переключиться из режима редактирования в командный режим, ввести v и команда автоматически появится в сеансе vim. Выход из сеанса (:wq) отправляет команду bash для выполнения.

person Tom Russell    schedule 27.03.2021

Пытаться

out=$(cat)

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

person sspprroo    schedule 06.09.2015
comment
попробуйте это: $ out=$(cat) && eval "$out". нажмите Enter после последней строки, затем CTRL+D, как было предложено выше. - person Mohamed Bana; 10.03.2017