Как выполнить несколько команд друг за другом с одним запросом к терминалу (без использования файла)?

22

Я мог бы (1) подготовить файл с напечатанными командами, разделенными конечной строкой, (2) сделать его исполняемым, (3) запустить его из менеджера файловой системы или терминала.

Но это смешно для неповторяющихся и постоянно повторяющихся наборов команд.

Могу ли я вместо этого ввести эти команды в терминал одним запросом?

Я не знаю символа конца строки для терминала - Ctrl, Shift или Alt с Enter не работают.  

Esamo
источник
1
В командной строке команды могут быть разделены точкой с запятой.
John1024

Ответы:

27

Вы можете разделить команды с помощью &&или ;.

  • && запускает следующую команду, только если предыдущая вышла со статусом 0 (была успешной):

    command1 && command2 && command3
    
  • ; выполняет все команды, даже если предыдущая выходит с ненулевым статусом:

    command1; command2; command3
    

Вы можете объединить эти разделители, как вы хотите.

MrVaykadji
источник
6
для command1 && command2команды2 будет выполняться только в том случае, если команда1 будет успешной.
souravc
Хорошие обсуждения, соответствующие / похожие сообщения: askubuntu.com/questions/334994/… stackoverflow.com/questions/13077241/…
gevang
@souravc: я сделал правку, спасибо, я кое-что узнал.
MrVaykadji
если объединить sudo apt upgradeи sudo systemctl reboot, вам нужно было бы добавить «sudo» дважды, или он «запомнит» sudo для второй команды?
Коен
9

Если вы заинтересованы в вводе каждой команды в отдельной строке в одном запросе, вы можете использовать следующий метод:

  • Начните ваш запрос (первая строка) с if :; then(это означает: если true, затем сделайте) и нажмите Enter; Ваше приглашение изменится, >и ничего не будет выполнено.

  • Введите ваши команды, каждая из которых сопровождается Enter

  • Завершите ваш запрос с помощью fi(конец вышеуказанного ifусловия) и нажмите Enter. Теперь все ваши команды будут выполняться в указанном порядке.

Пример:

radu@Radu: ~ $ if :; then
> echo 'something'
> echo 'something else'
> echo 'List current directory contents:'
> ls
> echo 'Change current directory with root directory:'
> cd
> #finish
> fi
something
something else
List current directory contents:
Backups            Desktop           forma3d  Public      Untitled txt.txt~
bin                Documente         Music    Templates   Videos
configuration.php  examples.desktop  passwd~  tmp~
Downloads          file~             Poze     Ubuntu One
Change current directory with root directory:
radu@Radu: / $
Раду Рэдяну
источник
if true; thenможет быть более понятным для чтения, если это желательно. :можно спутать с ;первого взгляда.
Кири
4

Во-первых, положить {на собственную линию.
Затем вставьте свои команды.
Затем вставьте }новую строку и нажмите Enter. Ваши команды будут выполнены.

Пример:

{
echo list
echo of
echo commands
echo to run at once
}

который напечатает (все сразу, без подсказки между ними):

list
of
commands
to run at once

Как примечание, { .. }это синтаксис группировки команд Bash. Это часто полезно в сочетании с &&или ||('и', и 'или' соответственно)

харакири
источник
Это то же самое, что if :; thenуже упоминалось? Или это немного отличается?
MrVaykadji
1
@MrVaykadji Это тот же результат, но другой метод. if :запускает тест по нулевой команде, которая всегда возвращает true. { .. }просто группирует команды вместе. Мне лично { .. }легче запомнить.
Кири