TGViewer
LinuxCamp | DevOps LinuxCamp | DevOps @linuxcamp_tg · 13.6K subscribers
Post #158 6.58K
Выполняй только то, что нужно! Условные списки Bash

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

Механизм списков позволяет не только разом выполнить группу команд, но и выстроить условную последовательность через операторы "&& (И)" и "|| (ИЛИ)".

Условные списки

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


$ cd dir
$ touch new.txt


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

Оболочка позволяет сделать эту зависимость явной, объединив команды оператором && (И):


$ cd dir && touch new.txt


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


$ git add . && git commit -m"fixed a bug" && git push


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

Так же, как оператор && запускает вторую команду только в случае успеха первой, оператор || (ИЛИ) запускает вторую команду только в случае сбоя первой.

Например, следующая команда пытается войти в каталог и, если это не удается, создает его:


$ cd dir || mkdir dir


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


cd dir || exit 1


Операторы && и || можно использовать вместе, чтобы настраивать более сложные действия:


$ cd dir || mkdir dir && cd dir || echo "I failed"


Последовательность предполагает попытку войти в каталог dir, если это не удается, создать каталог и войти в него, а если и это не удается, вывести ошибку.

Безусловные списки

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

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


$ sleep 7200; cp -a ~/files /mnt/backup_drive


Безусловные списки дают те же результаты, что и ввод команд по отдельности.

Единственное существенное различие - коды возврата. В таком списке коды отдельных команд отбрасываются, кроме последней.

Только код возврата последней команды в списке присваивается переменной оболочки "?":


$ mv file1 file2; mv file2 file3; mv file3 file4

# Код возврата команды «mv file3 file4»
$ echo $?
0


LinuxCamp
  • 👍 40
  • 🔥 10
  • ❤‍🔥 7
  • ❤ 1
More from @linuxcamp_tg
  1. Sep 28, 2026Проекту GNU вчера исполнилось 43 года 1983 год: Ричард Столлман объявил планы разработать…
  2. Sep 25, 2026Linux будет работать на ноутах с Snapdragon X2. Qualcomm добавляет полноценную поддержку L…
  3. Sep 24, 2026Так все по делу)) Советует же самый быстрый фикс LinuxCamp | #memes
  4. Sep 23, 2026Планы на 3 октября — прийти на RWB Infra x Security Meetup Мы направим прожекторы на инфра…
  5. Sep 22, 2026Ещё одна рекордная неделя для AI-разработки в Linux. На прошлой неделе в ядро попало 1 634…
  6. Sep 17, 2026Открыл плейлист, а как выйти - непонятно 😁 LinuxCamp | #memes
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →