Средства объединения команд

Автодополнение

История команд

Редактирование командной строки

Вводимую команду можно редактировать с помощью клавиш Backspace и Delete, перемещаться стрелками по всей строке. При редактировании полезны функции Ctrl-W — удаление слова перед курсором и Ctrl-U — удаление всей строки.

Двумя другими клавишами со стрелками — вверх и вниз — задействуется весьма мощный механизм bash — работа с историей команд. Все команды, набранные пользователем, командная оболочка запоминает и позволяет обращаться к ним впоследствии. По стрелке вверх, список поданных команд «прокручивается» от последней к первой, а по стрелке вниз — обратно. Соответствующая команда отображается в командной строке, как только что набранная, её можно отредактировать и подать оболочке (подгонять курсор к концу строки при этом необязательно).

Чтобы история команд могла сохраняться между сеансами работы пользователя, bash записывает ее в файл .bash_history, находящийся в домашнем каталоге пользователя. Делается это в момент завершения оболочки: накопленная за время работы история дописывается в конец этого файла. При следующем запуске командной оболочки считывает .bash_history целиком. История хранится не вечно, количество запоминаемых команд в .bash_history ограничено (обычно сохраняется 500 команд, но это можно и перенастроить).

Автодополнениe позволяeт быстро набирать команды и имена файлов. Во время набора имени команды или файла пользователь может нажать клавишу Tab, и командная оболочка попытается «дополнить» указанную команду или файл: предложит возможные варианты с данным началом или же дополнит имя, ведь часто набранной строки — пути к файлу и нескольких первых букв его имени — достаточно для однозначного указания на этот файл, потому что по введенному пути других файлов, чье имя начинается на эти буквы, просто нет.

Рисунок 2.14. средства объединения команд

Существует возможность объединять несколько команд в одной командной строке. Это можно делать несколькими способами:

Последовательное выполнение

Команды выполняются одна за другой, независимо от результата их исполнения. В качестве разделителя выступает символ точки с запятой («;»).

В качестве примера можно рассмотреть составную команду mkdir /tmp/test; cd /tmp/test, которая сначала создает каталог /tmp/test, а затем делает его текущим.

Условное выполнение (И)

Проверяется код завершения первой программы, если он равен 0, производится выполнение второй программы, и так далее. Таким образом, последняя команда выполнится только при успешном завершении всех предыдущих. В качестве разделителя выступают два амперсанда («&&»).

Например, команда mkdir /tmp/test && cd /tmp/test создает каталог /tmp/test, но переход в этот каталог будет выполнен только в том случае, если при выполнении первой части не возникло ошибки (например, каталог может уже существовать, и создать его невозможно).

Условное выполнение (ИЛИ)

Проверяется код завершения первой программы, если он не равен 0, производится выполнение второй программы, и так далее. Последняя команда будет запущена, только если ни одна из предыдущих не закончилась успешно. В качестве разделителя выступают две вертикальные черты («||»).

В качестве примера можно рассмотреть составную команду test -d /tmp/test || mkdir /tmp/test, которая проверяет существование директории /tmp/test и, если её нет, создаёт её.

Конвейер

При выполнении списка команд, объединённых в конвейер, стандартный вывод команды направляется на стандартный ввод следующей за ней команды в конвейере напрямую. Передаваемые данные рассматриваются как текстовые, передача производится построчно. Таким образом возникает поток данных, проходящих через несколько команд последовательно, как по конвейеру. Этот механизм является одной из самых фундаментальных особенностей UNIX и широко используется при работе в командной стоке.

Все программы могут быть запущены одновременно, так чтобы обеспечить интерактивность вывода при прохождении данных через цепочку программ. Если одна из программ в цепочке конвейера завершится (например, в случае ошибки), остальным будет отправлен специальный сигнал (SIGPIPE).

В качестве разделителя команд в конвейере используется символ вертикальный черты («|»).

Рассмотрим пример команды cat file.txt | uniq | sort, которая читает содержимое файла file.txt, удаляет из него повторяющиеся строки и сортирует оставшиеся строки по алфавиту. Результат выводится на экран.

Современные командные оболочки позволяют строить более гибкие условные выражения (с использованием скобок и знака отрицания) из выполняющихся команд.