Скорее всего, вы каждый день запускаете команды, которые зависят от выполнения предыдущих.
Механизм списков позволяет не только разом выполнить группу команд, но и выстроить условную последовательность через операторы "&& (И)" и "|| (ИЛИ)".
Условные списки
Предположим, вы хотите создать файл 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
