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

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

9 min read Linux Обновлено 13 Apr 2026
Запуск нескольких команд в Linux — операторы и скрипты
Запуск нескольких команд в Linux — операторы и скрипты

Терминал Linux с примерами команд

Командная строка Linux — это мощный инструмент. Она позволяет управлять файлами, процессами и сервисами через команды оболочки. Когда операций много, запускать команды по одной неудобно. Гораздо эффективнее связать команды в одну строку или собрать их в скрипт.

В этой инструкции мы подробно разберём все способы выполнения нескольких команд одновременно, объясним, когда какой подход уместен, и дадим готовые шаблоны и чек-листы.

Что значит «запустить несколько команд» — одно предложение

Запуск нескольких команд в одной строке означает последовательное или условное выполнение двух и более команд оболочки без ручного ввода между ними. Каждый оператор определяет условие перехода на следующую команду.

Краткие определения терминов:

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

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

Linux располагает тремя базовыми операторами, которые позволяют объединять команды в строке:

  1. Точка с запятой — ;
  2. Логическое И — &&
  3. Логическое ИЛИ — ||

Ниже — подробные правила, примеры и подводные камни для каждого из них.

Оператор “;” — выполнить всё подряд

Точка с запятой позволяет запускать несколько несвязанных команд последовательно. Следующая команда начнёт выполняться независимо от успешности предыдущей.

Синтаксис:

командаA ; командаB ; командаC

Пример:

whoami ; hostname

Вывод: сначала будет имя текущего пользователя, затем имя хоста. Даже если whoami по какой-то причине вернул ошибку, hostname всё равно запустится.

Изображение ниже показывает пример вывода при использовании точки с запятой.

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

Когда использовать:

  • Команды независимы друг от друга;
  • Важно выполнить каждую команду, даже если предыдущая упала;
  • Вы хотите получить несколько результатов подряд.

Ограничения и ошибки:

  • Нельзя полагаться на состояние, созданное предыдущей командой, если она может завершиться с ошибкой.

Оператор “||” — выполнить следующую только при ошибке предыдущей

Логическое ИЛИ запускает правую команду только в случае провала левой.

Синтаксис:

командаA || командаB

Поведение: командаB выполнится только если командаA вернёт код ошибки (не 0).

Пример:

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

Здесь touch создаст файл только если find не нашёл Document.txt (и, соответственно, вернул ненулевой код). Обратите внимание: корректнее проверять код выхода команды find — в простых цепочках это работает, но в сложных выражениях стоит использовать явные проверки.

Когда использовать:

  • В резервных сценариях (fallback): выполнить альтернативу, если основная команда не удалась;
  • При попытке выполнить действие только при отсутствии требуемого состояния.

Подводные камни:

  • Команды, возвращающие ненулевой код при отсутствии результата (как find), могут влиять на логику. Убедитесь, что используемая команда даёт ожидаемые коды возврата.

Оператор “&&” — выполнить следующую только при успехе предыдущей

Логическое И запускает правую команду только если левая завершилась успешно.

Синтаксис:

командаA && командаB

Пример:

mkdir Documents && cd Documents

Если mkdir выполнилась успешно, то произойдёт переход в каталог. Если нет (например, каталог уже существует и mkdir вернул ошибку без флага -p), cd не выполнится.

Когда использовать:

  • Для зависимости шагов, когда следующий шаг имеет смысл только после успешного предыдущего;
  • В сценариях установки/инициализации: создать ресурс, потом работать с ним.

Комбинирование операторов

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

Пример, который выглядит как “если A не удалась, выполнить B и затем C”:

commandA || commandB && commandC

Важно: это читается как

(commandA) || (commandB && commandC)

то есть если commandA терпит неудачу, тогда выполняется (commandB && commandC). Если вы хотели иную ассоциативность, используйте скобки в подпроцессах или группировку:

commandA || (commandB && commandC)
# или
commandA || { commandB && commandC; }

Пример практического применения:

find . -name Document || { echo "Directory not found" ; mkdir Document; }

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

Совет: всегда используйте явную группировку фигурными скобками { …; } или круглые скобки ( … ) для читабельности и предсказуемости.

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

Shell-скрипт — это файл с набором команд, который делает выполнение повторяемых операций одношаговым. Скрипт удобен для сложных, длинных или критичных процессов.

Как создать и запустить простой скрипт:

  1. Создайте файл, например deploy.sh, и добавьте строки команд.
  2. В начале файла укажите shebang, например #!/bin/bash.
  3. Сделайте файл исполняемым:
chmod +x deploy.sh
  1. Запустите:
./deploy.sh

Пример файла для обновления системы (Debian/Ubuntu):

#!/bin/bash
sudo apt update && sudo apt upgrade -y

Преимущества скриптов:

  • Повторяемость и консистентность действий;
  • Легко добавлять логирование и обработку ошибок;
  • Можно ставить в cron для автоматизации.

Советы по безопасности:

  • Не храните пароли в открытом виде. Используйте sudo с привязкой к правам или менеджеры секретов.
  • Ограничьте права на файл (chmod 700) для конфиденциальных скриптов.

Полезные приёмы и альтернативы объединению команд

Ниже — набор полезных трюков и альтернативных подходов, которые часто оказываются более надёжными или удобными:

  • Подпроцессы и конвейеры (|): передают stdout одной команды в stdin другой.
  • Группировка в фигурных скобках { …; }: позволяет выполнить несколько команд как одну логическую единицу.
  • Подстановка команд $(…): вставляет результат команды в другую команду.
  • Команда xargs для массовой обработки входных данных.
  • Использование set -e в скриптах: прерывать исполнение при любой ошибке.
  • Использование set -o pipefail: чтобы пайп возвращал ошибку при неудаче любой команды в конвейере.

Примеры:

Группировка и перенаправление вывода:

{ echo "Старт"; date; whoami; } > /tmp/job.log

Подстановка команды:

mkdir -p "$(date +%F)_backup" && tar -czf "$(date +%F)_backup.tar.gz" ./data

Использование xargs с find:

find . -type f -name '*.log' -print0 | xargs -0 gzip

Флаг set -e и pipefail в начале скрипта:

#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
# дальше — безопасные команды

Чит-лист (cheat sheet) — бысткая шпаргалка

  • Разделить команды всегда: ;
  • Выполнить следующее только при успехе: &&
  • Выполнить следующее только при ошибке: ||
  • Выполнить группу команд как единицу: { cmd1; cmd2; }
  • Выполнить группу в подшеле: (cmd1; cmd2)
  • Создать скрипт и сделать исполняемым: chmod +x file.sh
  • Остановить скрипт при ошибке: set -e

Короткие примеры:

# Несколько независимых команд
cmd1 ; cmd2 ; cmd3

# Последовательное выполнение только при успехе
cmd1 && cmd2 && cmd3

# Переход к запасному варианту при провале
cmd1 || cmd2

# Группа команд как единое целое
{ cmd1 && cmd2; } || cmd3

Сравнительная матрица операторов

ОператорКогда выполняется правая командаПрименениеОграничения
;ВсегдаНезависимые командыНе обеспечивает логических связей
&&Только при успешном выполнении левойШаги, зависящие друг от другаПравая не выполнится при ошибке

| || | Только при ошибке левой | Резервные действия / fallback | Требует понимания кодов выхода |

Модель мышления: “контроль потока — атомарные шаги”

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

Правила-эвристики:

  • Если шаг важен для следующего — используйте &&.
  • Если шаг не важен — используйте ;.
  • Если следующий шаг — запасной — используйте ||.
  • Для сложной логики группируйте шаги в { }.

Примеры реальных сценариев и когда метод не сработает

  1. Создание и вход в каталог:
mkdir Documents && cd Documents

Проблема: если Documents уже существует и mkdir вернёт ошибку, cd не выполнится. Решение: использовать mkdir -p или проверку:

mkdir -p Documents && cd Documents
  1. Создание файла только если нет такого файла:
find . -name Document.txt || touch Document.txt

Проблема: find может возвращать ненулевой код по другим причинам (например, ошибка доступа), тогда touch сработает неверно. Лучшее — проверить существование через test:

[ -f Document.txt ] || touch Document.txt
  1. Сложные цепочки с комбинацией && и || могут давать неожиданные результаты без группировки. Всегда группируйте логические блоки.

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

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

  • Использует скрипты для рутинных задач;
  • Добавляет set -euo pipefail в начале скриптов;
  • Логирует вывод и коды возврата;
  • Проводит тест в staging перед продакшеном;
  • Защищает скрипты правами доступа.

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

  • Использует && для последовательных шагов сборки;
  • Применяет подстановку команд для динамических имён;
  • Избавляется от громоздких однострочников ради читаемости;
  • Интегрирует скрипты в CI.

Новичок (начинающий пользователь):

  • Пробуйте команды по одной, затем объединяйте их;
  • Если не уверены, не используйте sudo;
  • Тестируйте команды в папке с тестовыми файлами;
  • Читайте коды возврата: echo $? после команды.

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

Чтобы однострочная последовательность считалась корректной:

  • Поведение должно быть предсказуемым при успехе и при неудаче;
  • Логика операторов документирована в комментарии или README;
  • При необходимости присутствует групповая скобка или подшель для ясности;
  • Скрипт не раскрывает секретов и имеет корректные права доступа.

Мини-методология: как безопасно переводить одноразовую команду в скрипт

  1. Протестируйте команды по отдельности.
  2. Добавьте set -euo pipefail и IFS в начало скрипта.
  3. Группируйте логические блоки и добавьте комментарии.
  4. Добавьте логирование и обработку ошибок.
  5. Запустите с ограниченными правами, затем в среде staging.
  6. Назначьте корректные права и храните в системе управления версиями.

Edge-case галерея (неочевидные ошибки)

  • Пайпы: если первая команда в пайпе падает, по-умолчанию шель вернёт успех — используйте pipefail.
  • Перезапись файлов: команды в однострочниках могут неожиданно перезаписать данные, особенно при использовании >.
  • Права доступа: touch или mkdir могут падать из-за отсутствия прав, но следующая команда может неожиданно выполниться при использовании ;
  • Пробелы и спецсимволы: неэкранированные пробелы в именах файлов ломают команду. Используйте кавычки.

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

Автоматическое резервное копирование каталога:

#!/bin/bash
set -euo pipefail
BACKUP_DIR="/backup/$(date +%F)"
mkdir -p "$BACKUP_DIR" && tar -czf "$BACKUP_DIR/data.tar.gz" /var/data

Обновление и очистка на Debian/Ubuntu:

#!/bin/bash
sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y

Обход ошибок в списке файлов и обработка каждой записи:

find . -type f -name '*.tmp' -print0 | xargs -0 -I{} bash -c 'rm -f "$1" || echo "Не удалось удалить $1"' _ {}

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

  • Не вставляйте пароли в командную строку;
  • Ограничьте доступ к скриптам через chmod;
  • Для автоматизации с привилегиями используйте sudoers с ограниченным набором команд;
  • Записывайте лог только необходимой информации, избегайте секретов в логах.

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

Краткое резюме

Используйте ; для независимых команд, && для цепочек шагов, зависящих от успеха, и || для запасных вариантов при ошибке. Для повторяемых процессов оформляйте последовательности в скрипты, добавляйте set -euo pipefail и логирование. Группируйте и документируйте логику, чтобы избежать неожиданных побочных эффектов.

Короткое объявление (для рассылки, ~120 слов)

Ускорьте работу в терминале: объединяйте команды и автоматизируйте рутинные задачи. В Linux три основных оператора позволяют управлять потоком выполнения: ; выполняет всё подряд, && запускает следующий шаг при успехе, а || — при ошибке предыдущего шага. Для повторяемых операций используйте shell-скрипты с set -euo pipefail и группировкой команд. В статье — практические примеры, чек-листы для админа и разработчика, шаблоны скриптов и советы по безопасности. Научитесь избегать типичных ошибок и делайте автоматизацию предсказуемой и безопасной.

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

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

Twitter Fleets: как публиковать исчезающие записи
Социальные сети

Twitter Fleets: как публиковать исчезающие записи

Смена дистрибутива Linux без потери данных
Linux

Смена дистрибутива Linux без потери данных

Улучшите мозг в 2015: одна привычка
Саморазвитие

Улучшите мозг в 2015: одна привычка

React Router в React — быстрая настройка
Frontend

React Router в React — быстрая настройка

Добавить и удалить слова в Словаре macOS
macOS

Добавить и удалить слова в Словаре macOS

Исправить цикл входа в Ubuntu
Linux

Исправить цикл входа в Ubuntu