Гид по технологиям

Как запускать несколько команд в Linux одновременно

8 min read Linux команды Обновлено 06 Dec 2025
Запуск нескольких команд в Linux
Запуск нескольких команд в Linux

Команды терминала Linux на экране

Введение

Терминал Linux — мощный инструмент для управления системой через текстовые команды. Простые операции: работа с файлами, установка пакетов, управление службами — часто выполняются быстрее через оболочку. Но ввод команд по одной неэффективен при повторяющихся задачах. Чтобы ускорить работу и автоматизировать последовательности, команды объединяют в одну строку или помещают в скрипт.

В этой статье вы найдёте понятные правила выбора между операторами, примеры, шаблоны сценариев и чек‑листы для ролей (разработчик, администратор), рекомендации по безопасности и тестированию. В конце — краткая памятка и decision‑tree в Mermaid для быстрой навигации.

Important: Код в примерах безопасно иллюстрирует поведение операторов; перед запуском команд, затрагивающих данные или систему, выполните бэкап или протестируйте в изолированном окружении.

Основные операторы для запуска нескольких команд

Linux поддерживает несколько способов последовательного и условного выполнения команд в оболочке:

  • ; — выполняет все команды подряд независимо от кода возврата предыдущей команды.
  • && — выполняет следующую команду только если предыдущая завершилась успешно (код возврата 0).
  • || — выполняет следующую команду только если предыдущая завершилась с ошибкой (код возврата не 0).
  • Также применимы: | (конвейер), & (фоновый запуск), скобки (subshell) и фигурные скобки для группировки команд.

Ниже — подробное описание каждого оператора с практическими примерами.

Точка с запятой ; — всегда выполнить

Описание: Оператор ; разделяет команды и гарантирует, что каждая будет запущена по порядку, независимо от результата предыдущей.

Синтаксис:

commandA ; commandB ; commandC

Пример: вывести имя пользователя и имя хоста:

whoami ; hostname

Когда использовать: когда команды не зависят друг от друга или вы хотите выполнить все шаги независимо от ошибок.

Примечание: если любая команда вызывает серьёзные побочные эффекты, используйте проверки возврата, чтобы избежать нежелательных действий.

Запуск нескольких команд через точку с запятой

Альтернатива: если частично зависимые операции, рассмотрите комбинацию && и ||.

Логическое И && — выполнить при успешном завершении

Описание: Оператор && выполняет следующую команду только если предыдущая вернула код 0 (успех).

Синтаксис:

commandA && commandB

Пример: создать каталог и сразу перейти в него только при успешном создании:

mkdir Documents && cd Documents

Когда использовать: при построении цепочек, где следующий шаг имеет смысл только при успешном завершении предыдущего (сборка → тест → деплой и т. п.).

Совет: для сценариев автоматической установки полезно сочетать && с проверками состояния и логированием.

Логическое ИЛИ || — выполнить при ошибке предыдущей команды

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

Синтаксис:

commandA || commandB

Пример: создать файл, только если его нет:

find . -name Document.txt || touch Document.txt

Здесь find возвращает 0, если файл найден; тогда touch не будет вызван. Если find вернёт ненулевой код, touch создаст файл.

Когда использовать: для резервных планов, обработчиков ошибок или попыток альтернативного пути при неудаче.

Комбинация операторов и порядок выполнения

Операторы можно комбинировать в одной строке. Важно понимать приоритет: && и || имеют одинаковый приоритет и оцениваются слева направо, точка с запятой выполняется как разделитель последовательностей. Без явной группировки комбинации могут дать неожиданный результат.

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

commandA || commandB && commandC

Это читается как:

  1. Выполнить commandA. Если commandA неуспешна, выполнить commandB.
  2. Затем, если commandB успешна (или если commandA была успешна и commandB вовсе не запускалась), выполнить commandC.

Практический пример: создать папку, если её нет, и вывести сообщение:

find . -name Document || echo "Directory not found" && mkdir Document

Однако поведение может отличаться от ожидаемого, если вы хотите, чтобы mkdir выполнялся только при неудаче find. Для явной семантики используйте скобки или подшелл.

Группировка команд: скобки и фигурные скобки

  • Подшелл: ( … ) — команды в круглых скобках выполняются в подшелле; изменения окружения (cd, export) не повлияют на родительский шелл.
(commandA && commandB) || commandC
  • Группировка без подшелла: { … ; } — команды выполняются в текущем шелле; обязательно ставьте точку с запятой перед закрывающей фигурной скобкой.
{ commandA && commandB ; } || commandC

Пример: создать каталог и перейти в него в одном контексте (без подшелла):

{ mkdir newdir && cd newdir ; }

Если использовать (mkdir newdir && cd newdir), переход в каталог произойдёт только в подшелле и не сохранится в текущем сеансе.

Когда использовать: выбирайте ( ) если хотите изолировать побочные эффекты, и { } когда изменения окружения должны сохранитьcя.

Конвейеры и фоновые процессы

  • Пайп | передаёт stdout одной команды в stdin следующей.
cat file.txt | grep pattern | wc -l
  • Фоновый запуск &: запускает процесс в фоне; оболочка немедленно возвращает управление.
long_running_task &

Комбинации с логическими операторами тоже возможны, но учитывайте, что код возврата для фонового процесса не будет ждать завершения задачи.

Сценарии (скрипты) — запуск серия команд как программы

Скрипт — удобный способ сохранять и повторно запускать набор команд. Пример простого скрипта обновления системы (Debian/Ubuntu):

  1. Создайте файл с расширением .sh, например update_system.sh
  2. Поместите в него:
#!/bin/bash
set -euo pipefail

sudo apt update && sudo apt upgrade -y
  1. Сделайте исполняемым и запустите:
chmod +x update_system.sh
./update_system.sh

Пояснения:

  • set -e завершит скрипт при первой ошибке.
  • set -u обнаружит использование необъявленных переменных.
  • set -o pipefail гарантирует, что пайп вернёт ненулевой код, если хотя бы одна команда в цепочке неуспешна.

Критерии приёмки: скрипт должен корректно завершаться с кодом 0 при успешном выполнении, логировать критичные шаги и не требовать интерактивного ввода без явного подтверждения.

Безопасность и приватность

Important: Никогда не храните пароли, токены или другие секреты в открытых скриптах. Используйте безопасное хранилище паролей (secret manager), переменные окружения в защищённых CI или prompting при необходимости.

Рекомендации:

  • Ограничьте права на скрипты: chmod 700.
  • Проверяйте вводимые имена файлов/путей перед выполнением команд с удалением или перезаписью.
  • При работе с sudo используйте минимально необходимые привилегии и проверенные команды.

Приватность: если ваш скрипт логирует данные, убедитесь, что логи не содержат персональных данных или чувствительной информации, соответствуйте внутренним правилам конфиденциальности и законодательству.

Отладка и диагностика

Как узнать код возврата? Команда echo $? вернёт код последней команды.

false || echo "предыдущая команда завершилась с ошибкой" ; echo $?

Полезные приёмы:

  • set -x — включить трассировку выполнения (печать каждой команды перед запуском).
  • trap ‘echo “Ошибка на строке $LINENO”; exit 1’ ERR — ловушка при ошибке.

Распространённые ошибки и когда это не сработает

  • Ожидание, что && и || имеют приоритет: они выполняются слева направо; без группировки результат может отличаться от ожидаемого.
  • Переход в каталог в подшелле ( ) не изменит текущий рабочий каталог родительского процесса.
  • Фоновые процессы (&) не блокируют выполнение последующих команд и не гарантируют завершения к моменту проверки их статуса.

Counterexample: команда

false && echo OK || echo FAIL

Выведет FAIL, потому что false возвращает ошибку, && пропускает правую часть, затем || срабатывает.

Методика выбора оператора (мини‑методология)

  1. Определите зависимость: нужна ли следующая команда только при успехе предыдущей? Если да — &&.
  2. Нужно ли выполнить альтернативу при ошибке? Если да — ||.
  3. Независимые действия — ;.
  4. Если логика сложная, сгруппируйте выражения с ( ) или { } для явного порядка.
  5. В скриптах используйте set -euo pipefail и trap для надёжного поведения.

Шаблоны и готовые сниппеты

Шаблон: безопасный сценарий с логированием

#!/bin/bash
set -euo pipefail
trap 'echo "Ошибка на строке $LINENO" >&2' ERR

log() { echo "[$(date -Iseconds)] $*"; }

log "Начало выполнения"
commandA && log "commandA выполнилась" || { log "commandA НЕ выполнилась"; exit 1; }
commandB ; log "commandB запущена независимо" 

log "Готово"

Шаблон: попытка выполнить резервную команду при ошибке

primary_command || { echo "Primary failed, running fallback"; fallback_command; }

Тест‑кейсы для команды с && и ||:

  • Сценарий: первая команда успешна → вторая выполняется (для &&).
  • Сценарий: первая команда неуспешна → проверка, что || запускает альтернативную команду.
  • Сценарий: проверка, что ( ) изолирует изменения окружения.

Чек‑лист по ролям

Разработчик:

  • Понимать exit code и использовать && для последовательности сборка→тест.
  • Упаковывать часто повторяющиеся цепочки в скрипты.
  • Не хранить секреты в скриптах.

Системный администратор:

  • Использовать set -e для критичных обновлений.
  • Логировать действия и использовать trap для корректной обработки ошибок.
  • Тестировать в staging перед production.

Инженер DevOps:

  • Интегрировать скрипты в CI/CD с явными проверками успешности.
  • Использовать секрет‑менеджеры и роутинг логов.

Decision tree (Mermaid)

flowchart TD
  A[Нужно выполнить несколько команд?] --> B{Команды зависимы?}
  B -- Да --> C{Требуется выполнение только при успехе?}
  C -- Да --> D[Использовать &&]
  C -- Нет --> E{Нужен резерв при ошибке?}
  E -- Да --> F[Использовать || или сочетание с { }]
  E -- Нет --> G[Группировка ' ' или { }]
  B -- Нет --> H[Использовать ;]
  D --> I[Рассмотреть set -e в скрипте]
  F --> I
  G --> I
  H --> I

Критерии приёмки

  • Команды выполняются в ожидаемой последовательности при различных кодах возврата.
  • Скрипты корректно завершаются при ошибках (при необходимости) и дают понятные логи.
  • Никакие секреты не попадают в исходные файлы или логи.

Мини‑фактбокс

  • Код возврата 0 означает успех; любой ненулевой код — ошибка.
  • set -e останавливает скрипт при первой ошибке (но будьте осторожны с &&/|| и пайпами).
  • ( ) создаёт подшелл; { } выполняет в текущем шелле.

Примеры реальных сценариев

  1. Быстро собрать проект и запустить тесты, остановиться если сборка неудачна:
make build && make test
  1. Попытаться создать резервную копию, если основной метод не сработал:
rsync -avz /data remote:/backup || tar czf /tmp/backup.tar.gz /data
  1. Выполнить команду в фоне и дождаться завершения, затем проверить код возврата:
long_task & pid=$!
wait $pid
echo "exit code: $?"

Советы по локализации и совместимости

  • Синтаксис команд оболочки POSIX совместим с большинством современных дистрибутивов; bash добавляет расширения.
  • Для максимальной переносимости используйте /bin/sh и POSIX‑совместимые конструкции.
  • В дистрибутивах на базе Debian используйте apt, в RHEL‑based — dnf/yum (проверяйте пакетный менеджер перед автоматизацией).

Сводка

Используйте:

  • ; — когда команды независимы и нужно выполнить все подряд.
  • && — когда следующий шаг имеет смысл только при успехе предыдущего.
  • || — для резервной логики или обработки ошибок.

Группируйте команды, применяйте set -euo pipefail в скриптах, используйте trap для надёжной обработки ошибок. Тестируйте скрипты в безопасной среде и не храните секреты в открытом виде.

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

Краткий глоссарий:

  • exit code: краткий числовой статус завершения команды (0 = успех).
  • подшелл: отдельный экземпляр оболочки, выполняющий набор команд.
  • pipefail: опция, влияющая на код возврата конвейера.

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

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство