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

Командная строка Linux — это мощный инструмент. Она позволяет управлять файлами, процессами и сервисами через команды оболочки. Когда операций много, запускать команды по одной неудобно. Гораздо эффективнее связать команды в одну строку или собрать их в скрипт.
В этой инструкции мы подробно разберём все способы выполнения нескольких команд одновременно, объясним, когда какой подход уместен, и дадим готовые шаблоны и чек-листы.
Что значит «запустить несколько команд» — одно предложение
Запуск нескольких команд в одной строке означает последовательное или условное выполнение двух и более команд оболочки без ручного ввода между ними. Каждый оператор определяет условие перехода на следующую команду.
Краткие определения терминов:
- Оператор ; — выполняет команды подряд, независимо от результата предыдущей.
- Оператор && — выполняет следующую команду только если предыдущая завершилась успешно (код возврата 0).
- Оператор || — выполняет следующую команду только если предыдущая завершилась с ошибкой (код возврата не 0).
Основные операторы для запуска нескольких команд
Linux располагает тремя базовыми операторами, которые позволяют объединять команды в строке:
- Точка с запятой — ;
- Логическое И — &&
- Логическое ИЛИ — ||
Ниже — подробные правила, примеры и подводные камни для каждого из них.
Оператор “;” — выполнить всё подряд
Точка с запятой позволяет запускать несколько несвязанных команд последовательно. Следующая команда начнёт выполняться независимо от успешности предыдущей.
Синтаксис:
команда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-скрипт — это файл с набором команд, который делает выполнение повторяемых операций одношаговым. Скрипт удобен для сложных, длинных или критичных процессов.
Как создать и запустить простой скрипт:
- Создайте файл, например deploy.sh, и добавьте строки команд.
- В начале файла укажите shebang, например #!/bin/bash.
- Сделайте файл исполняемым:
chmod +x deploy.sh- Запустите:
./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 | Требует понимания кодов выхода |
Модель мышления: “контроль потока — атомарные шаги”
Ментальная модель: думайте о каждой команде как о шаге в конвейере и выбирайте оператор в зависимости от того, должен ли следующий шаг выполняться при неудаче или успехе.
Правила-эвристики:
- Если шаг важен для следующего — используйте &&.
- Если шаг не важен — используйте ;.
- Если следующий шаг — запасной — используйте ||.
- Для сложной логики группируйте шаги в { }.
Примеры реальных сценариев и когда метод не сработает
- Создание и вход в каталог:
mkdir Documents && cd DocumentsПроблема: если Documents уже существует и mkdir вернёт ошибку, cd не выполнится. Решение: использовать mkdir -p или проверку:
mkdir -p Documents && cd Documents- Создание файла только если нет такого файла:
find . -name Document.txt || touch Document.txtПроблема: find может возвращать ненулевой код по другим причинам (например, ошибка доступа), тогда touch сработает неверно. Лучшее — проверить существование через test:
[ -f Document.txt ] || touch Document.txt- Сложные цепочки с комбинацией && и || могут давать неожиданные результаты без группировки. Всегда группируйте логические блоки.
Чек-листы по ролям
Системный администратор:
- Использует скрипты для рутинных задач;
- Добавляет set -euo pipefail в начале скриптов;
- Логирует вывод и коды возврата;
- Проводит тест в staging перед продакшеном;
- Защищает скрипты правами доступа.
Разработчик:
- Использует && для последовательных шагов сборки;
- Применяет подстановку команд для динамических имён;
- Избавляется от громоздких однострочников ради читаемости;
- Интегрирует скрипты в CI.
Новичок (начинающий пользователь):
- Пробуйте команды по одной, затем объединяйте их;
- Если не уверены, не используйте sudo;
- Тестируйте команды в папке с тестовыми файлами;
- Читайте коды возврата: echo $? после команды.
Критерии приёмки
Чтобы однострочная последовательность считалась корректной:
- Поведение должно быть предсказуемым при успехе и при неудаче;
- Логика операторов документирована в комментарии или README;
- При необходимости присутствует групповая скобка или подшель для ясности;
- Скрипт не раскрывает секретов и имеет корректные права доступа.
Мини-методология: как безопасно переводить одноразовую команду в скрипт
- Протестируйте команды по отдельности.
- Добавьте set -euo pipefail и IFS в начало скрипта.
- Группируйте логические блоки и добавьте комментарии.
- Добавьте логирование и обработку ошибок.
- Запустите с ограниченными правами, затем в среде staging.
- Назначьте корректные права и храните в системе управления версиями.
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 и группировкой команд. В статье — практические примеры, чек-листы для админа и разработчика, шаблоны скриптов и советы по безопасности. Научитесь избегать типичных ошибок и делайте автоматизацию предсказуемой и безопасной.