Некоторые из самых удобных «фишек» в Linux зависят от правильного использования нескольких специальных символов. Эта статья (перевод [1]) рассматривает ряд командных операторов в Linux и показывает, как они работают.
О высокой продуктивности командной строки Linux одинаково свидетельсткуют как доступные в ней операторы, так и обширная коллекция многофункциональных команд Linux. Некоторые из самых удобных «фишек» в Linux зависят от правильного использования нескольких специальных символов. Эта статья (перевод [1]) рассматривает ряд командных операторов в Linux и показывает, как они работают.
[Оператор канала |]
Открытие канала командной строки (pipe), выраженное символом |, это один из самых полезных (и самый часто используемый) доступных операторов. Он передает результат своей работы на правую сторону от себя через специальное соединение. Например, вы могли бы использовать команду who, чтобы определить, какие пользователи залогинились в системе:
Команда awk в этом примере уменьшает объем вывода из каждой стоки только первым столбцом. Затем команда sort сортирует результат в алфавитном порядке, так чтобы команда uniq представила вывод таким образом, чтобы выводимые имеа были уникальными.
[Использование ||]
Несмотря на кажущееся сходство | и ||, две вертикальные линии не представляют собой двойной канал, и работает совершенно по-другому. Вместо этого две вертикальные линии представляют оператор «или», и они работают интересным образом. То есть, если команда с левой стороны || отработала успешно (возвратила статус 0), то команда с правой стороны вообще не будет выполняться.
В примере, показанном ниже, команда head потерпит неудачу, потому что она не была запущена с правами суперпользователя (привилегией уровня root, например через sudo). Т. е. у команды head не будет доступа к файлу /etc/shadow, и в результате оператор || выполнит команду echo:
$ head -4 /etc/shadow || echo oops
head: cannot open '/etc/shadow' for reading: Permission denied
oops
Если вы хотите, чтобы не выводилось сообщение об ошибке команды head, то вы могли бы перенаправить её вывод в устройство /dev/null, примерно так:
$ head -4 /etc/shadow 2>/dev/null || echo oops
oops
Оператор 2> в этом примере перенаправляет стандартный вывод ошибок (stderr), в нашем примере в /dev/null.
[Использование > и >>]
Операторы > и >> сильно связаны друг с другом, в отличие от операторов | и ||. Если вы запустите следующие команды, то увидите, что каждая команда с оператором > перезаписывает содержимое файла readme результатом вывода команды fortune:
$ /usr/games/fortune > readme
$ cat readme
I think, therefore I am... I think.
$ /usr/games/fortune > readme
$ cat readme
Employees must wash hands before returning to work.
Но если вы будете использовать >> вместо >, то существующий файл не будет перезаписываться, к нему будет добавляться содержимое каждого вызова fortune:
$ cat readme
Employees must wash hands before returning to work.
$ /usr/games/fortune >> readme
$ cat readme
Employees must wash hands before returning to work.
Rule the Empire through force.
-- Shogun Tokugawa
$ /usr/games/fortune >> readme
$ cat readme
Employees must wash hands before returning to work.
Rule the Empire through force.
-- Shogun Tokugawa
Sic transit gloria mundi.
[So passes away the glory of this world.]
-- Thomas a Kempis
Подобно операторам | и ||, действия операторов & и && совершенно отличается функционально, несмотря на то, что выглядят они очень похоже. Одиночный оператор & используется для запуска процесса в фоновом режиме (background). Это значит, что вы можете запускать в консоли другие команды, когда запустили команду, которая выполняет какие-то длительные действия в отдельном процессе:
$ gedit file1.txt &
$ gedit file2.txt &
$
Обратите внимание, что после каждой команды сохраняется возможность ввода следующей команды, несмотря на то, что был запущен процесс текстового редактора gedit.
Оператор &&, с другой стороны, больше похож по принципу работы на оператор ||, но его действие противоположное. Т. е. команда в правой части оператора && будет запущена только тогда, когда команда в левой части была выполнена успешно.
$ echo hello && echo goodbye
hello
goodbye
[Использование ;]
Оператор ; позволяет вам запустить несколько команд в одной строке команды. Он просто отделит отдельные команды друг от друга, благодаря чему они будут запускаться последовательно, одна за одной.
Оператор ! (отрицание) позволяет выразить исключение при вводе команд. В примере ниже создаются файлы readme1.txt и readme2.txt:
$ cd ~
$ /usr/games/fortune > readme1.txt
$ /usr/games/fortune > readme2.txt
$ ls
readme readme1.txt readme2.txt
Оператор ! позволяет инвертировать то, что должна выводить команда ls:
$ ls *1.txt
readme1.txt
$ ls !(*1.txt)
readme readme2.txt
Следующая команда удалит все файлы в текущем каталоге, кроме тех, которые будут соответствовать шаблону *1.txt:
$ rm !(*1.txt)
$ ls
readme1.txt
[Использование =, == и !=]
Оператор =, как вы наверное уже знаете, используется для присвоения значения переменной окружения (или переменной скрипта). Операторы == и != выполняют проверку на равенство и неравенство.
Следующий пример команды выведет сообщение "Я люблю математику":
$ three=3
$ if [ $three == 3 ]; then echo Я люблю математику ; fi
Я люблю математику
Следующий пример команды ничего не выведет:
$ if [ $three != 3 ]; then echo "Я не доверяю математике"; fi
[Использование символа экранирования \ (escape)]
Символ обратного слеша \ (backslash) работает как символ экранирования (как минимум верно для Bourne shell). Он позволяет отобразить любые символы без их интерпретации как специальные операторы. В следующей сложной строке будет отображен каждый "специальный" символ, потому что перед каждым из них присутствует backslash:
$ echo \"\'\&\|\;\(\)\^\'\>\$
"'&|;()^'>$
[Ссылки]
1. Linux operators: Using |, >, >>, &, &&, !, =, (\) and many more site:networkworld.com. 2. Bash Fortunes site:cocalc.com.