Команды выполняются одна за другой, не зависимо от результата их исполнения. В качестве разделителя выступает символ точки с запятой («;»).
В качестве примера можно рассмотреть составную команду du -sh; date, которая выводит на экран содержимое домашней директории, а затем текущие дату и время.
Условное выполнение (И)
Проверяется код завершения первой программы, если он равен 0, производится выполнение второй программы, и так далее. Таким образом, последняя команда выполнится только при успешном завершении всех предыдущих. В качестве разделителя выступают два амперсанда («&&»).
В качестве примера можно рассмотреть составную команду test -r /tmp/txt && cp /tmp/txt, которая проверяет возможность чтения файла /tmp/txt и в случае успеха, копирует этот файл в локальную директорию.
Условное выполнение (ИЛИ)
Проверяется код завершения первой программы, если он не равен 0, производится выполнение второй программы, и так далее. Последняя команда будет запущена только если ни одна из предыдущих не закончилась успешно. В качестве разделителя выступают две вертикальный черты («||»).
В качестве примера можно рассмотреть составную команду test -d /tmp/dir || mkdir /tmp/dir, которая проверяет существование директории /tmp/dir и если её нет, создаёт её.
Конвейер
При выполнении программ связываются их стандартные выходы и входы, так что текстовые данные передаются через них последовательно, как по конвейеру. Этот механизм является одной из самых фундаментальных особенностей UNIX и широко используется при работе в командной стоке.
Все программы могут быть запущены одновременно, так чтобы обеспечить интерактивность вывода при прохождении данных через цепочку программ. Если одна из программ в цепочке конвейера завершится (например, в случае ошибки), остальным будет отправлен специальный сигнал (SIGPIPE).
В качестве разделителя используется символ вертикальный черты («|»).
Рассмотрим пример команды cat file.txt | uniq | sort, которая читает содержимое файла file.txt, удаляет из него повторяющиеся строки и сортирует оставшиеся строки по алфавиту. Результат выводится на экран.
Современные командные оболочки позволяют строить более гибкие условные выражения (с использованием скобок и знака отрицания) из выполняющихся команд.
Служебные символы
Из предыдущих разделов видно, что в командной строке присутствует множество служебных символов, каждый из которых имеет своё значение. Все эти символы следует с осторожностью использовать в именах файлов.
Рассмотрим основные группы служебных символов командной оболочки:
Символы-разделители
Используются для отделения частей команды или нескольких команд. К ним относятся: пробел, табуляция. По умолчанию команды разделяются символом перевода строки. При использовании символа пробела в именах файлов необходимо заключать параметр в кавычки или предварять пробел символом обратной косой («\»).
Символы пути
Используются для разделения элементов пути. Сюда можно отнести символ корня («/») и символ домашней директории («~») – в командной строке он автоматически заменяется на полный путь к домашней директории. При этих символов в именах файлов необходимо предварять их символом обратной косой («\»).
Символы команд
Применяются в аргументах команд, для отделения нескольких команд, для запуска процессов на заднем фоне и т.п. К таким символам можно отнести: «*», «&», «<», «>», «;», «(», «)», «|», «"». При этих символов в именах файлов необходимо предварять их символом обратной косой («\»).
Символ параметров команды
Символ «-» используются для задания параметров команд. Проблемы могут возникнуть, если имя файла начинается с этого символа – в этом случае командная оболочка может принять такой аргумент за набор параметров. Стандартным выходом из этой ситуации является явное указание окончания списка параметров с «--», например:
user@desktop ~ $ ls -l -- -test-file-rw-r--r-- 1 user users 90 Сен 19 00:20 -test-file