Секреты Терминала. Часть 18: Объединение команд

Секреты Терминала. Часть 18: Объединение команд Cтатьи

Некоторые из наших циклов статей никогда нельзя будет считать закрытыми, настолько много есть материала, о котором можно было бы рассказать нашим уважаемым читателям в их рамках. В особенности это касается цикла о Терминале OS X – наши постоянные читатели знают, что с помощью терминальных команд решается чуть ли не половина каверзных вопросов в рубрике FAQ.

Сегодня мы хотели бы впервые в этом году дополнить цикл «Секреты Терминала» новой статьёй, которая станет восемнадцатой по счёту. Её мы посвятим одной достаточно важной возможности — объединению команд. Мы планомерно пройдемся по возможностям, предлагаемым оболочкой Терминала OS X и опишем, как и где можно это применить.

Начнем с самого простого:

;

Символ точки с запятой позволяет нам выполнять команды последовательно. По завершении одной из цепочки будет сразу же вызвана другая. Забегая вперёд, скажем, что нужно быть осторожным с таким объединением.

zip -9 arch.zip our_file; mv arch.zip ~/; rm our_file

Выполнение подобного рода кода может быть потенциально опасно. Первая команда выполняет сжатие с максимальной степенью компрессии, создает нам архив, содержащий один наш файл, перемещает этот архив в домашнюю директорию и удаляет исходный документ за ненадобностью. Мы же уверены, что все прошло корректно? В принципе, да. Где же здесь может быть ошибка? А она может быть в том случае, если мы неправильно написали название файла. Автоматическое дополнение по кнопке Tab никто не отменял, оно всегда поможет, но есть быть много довольно похожих названий и риск промахнуться всегда присутствует. В этом случае архив не создастся, перемещать будет просто нечего, но зато, в результате действия последней команды, мы останемся и без исходного файла. Перспектива никак не радует? Выход есть.

&&

Вот эта команда уже учитывает ошибки. С ней мы не сможем проделать трюк, о котором говорили выше. Цепочка просто оборвется на той команде, которая вызвала ошибку и мы не сможем дойти до команды удаления. Таким образом, указанная ниже цепочка выполняет те же действия, что и обычная точка с запятой, но то, что стоит справа, выполнится только тогда, когда левый операнд завершен успешно. Поэтому напишем безопасную альтернативу:

zip -9 arch.zip our_file && mv arch.zip ~/ && rm our_file

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

||

Действует он наоборот. Если левое выражение завершилось с ошибкой, то выполнится правое. Мы можем использовать это в том случае, если ошибку нам как раз и нужно обработать, например, в простом случае вывести какую-то информацию на экран с помощью echo. Или запустить новую цепочку действий.

$()

Эта команда используется тогда, когда нам нужно передать выходные данные одного выражение в другое. В скобках пишется то, которое является «донором» этих самых данных. Приведем пример:

ping $(cat host)

Здесь мы рассмотрели случай, когда в нашем файле написан адрес в Сети. Чтобы вручную не копировать содержимое документа из редактора или даже из Терминала, мы сделаем все одной строкой. Запишем в файл что-нибудь вроде google.com или localhost и убедимся, что все работает.

Теперь рассмотрим ещё одного главного помощника в случае лени и/или огромного числа работы:

>

С помощью этой команды мы можем направлять вывод какой-то команды прямо в файл. Мы можем выполнить выражение и посмотреть позже, что же там она вывела.

ls > file.txt

Совершенно простой пример, который сохранит в файл информацию о содержимом директории. Сразу же отметим, если необходимо добавлять информацию вновь и вновь в один и тот же документ, то необходимо использовать такую команду:

>>

В этом случае вывод будет добавляться в конец файла, не затирая то, что было.

В случае использования означенных выше команд, Терминал окажется пуст. Весь вывод — только в файл.

Ещё один помощник:

|

Не стоит путать с тем, что рассмотрено выше (||). Эта команда позволяет передавать нам результат работы одного выражения в другое. На этот раз речь идет не об аргументе, как это было выше в случае с $(). Приведем пример и все сразу станет понятно:

history | grep ssh

Довольно полезная конструкция. Первая команда выведет историю работы с Терминалом, а вторая найдет те строки, которые содержат нужную нам информацию. В данном случае мы хотим узнать, когда же мы использовали ssh для работы с удаленной машиной, какие там параметры были, с чем мы соединялись. Таким образом вторая команда, grep, будет работать с тем, что ей досталось от предыдущей программы, искать только там. Вообще говоря, этот пример — распространенный случай. Только history может быть заменена на cat для поиска в содержимом файла.

Мы рассмотрели основные способы комбинирования команд. С помощью этих знаний можно создавать куда более сложные сценарии, которые ещё сильнее упростят жизнь и ещё больше полезных вещей автоматизируют или упростят. Желаем удачи! Только не забывайте о безопасности при работе с rm 😉

Источник: appstudio.org

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *