Администрирование FreeBSD, Linux, ... Операторы командной строки Linux: использование |, >, >>, &, &&, !, =, () Sun, December 08 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


Операторы командной строки Linux: использование |, >, >>, &, &&, !, =, (\) Печать
Добавил(а) microsin   

Некоторые из самых удобных «фишек» в Linux зависят от правильного использования нескольких специальных символов. Эта статья (перевод [1]) рассматривает ряд командных операторов в Linux и показывает, как они работают.

О высокой продуктивности командной строки Linux одинаково свидетельсткуют как доступные в ней операторы, так и обширная коллекция многофункциональных команд Linux. Некоторые из самых удобных «фишек» в Linux зависят от правильного использования нескольких специальных символов. Эта статья (перевод [1]) рассматривает ряд командных операторов в Linux и показывает, как они работают.

[Оператор канала |]

Открытие канала командной строки (pipe), выраженное символом |, это один из самых полезных (и самый часто используемый) доступных операторов. Он передает результат своей работы на правую сторону от себя через специальное соединение. Например, вы могли бы использовать команду who, чтобы определить, какие пользователи залогинились в системе:

$ who
jdoe     seat0        2024-06-20 10:37 (login screen)
jdoe     tty2         2024-06-20 10:39 (tty2)
nancy    tty3         2024-06-20 10:40 (tty2)
shs      pts/1        2024-06-20 10:56 (192.168.0.5)

Если вы только хотите узнать только количество логинов, то можете использовать pipe примерно так:

$ who | wc -l
4

Если вы хотите увидеть, сколько уникальных пользователей вошли в систему, понадобится более сложная команда:

$ who | awk '{print $1}' | sort | uniq
jdoe
nancy
shs

Команда 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

$ sudo apt-get install fortunes fortune-mod cowsay
$ apt-cache search fortune
$ apt-cache search cowsay
$ cd ~
$ git clone https://github.com/maxieds/math-fortune-mod.git
$ cd math-fortune-mod/
$ sudo cp math.fortunes{,.dat} /usr/share/games/fortunes/
$ sudo cp Sigma.cow /usr/share/cowsay/cows/
$ /usr/games/fortune math.fortunes | /usr/games/cowsay -f Sigma

[Использование & и &&]

Подобно операторам | и ||, действия операторов & и && совершенно отличается функционально, несмотря на то, что выглядят они очень похоже. Одиночный оператор & используется для запуска процесса в фоновом режиме (background). Это значит, что вы можете запускать в консоли другие команды, когда запустили команду, которая выполняет какие-то длительные действия в отдельном процессе:

$ gedit file1.txt &
$ gedit file2.txt &
$

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

Оператор &&, с другой стороны, больше похож по принципу работы на оператор ||, но его действие противоположное. Т. е. команда в правой части оператора && будет запущена только тогда, когда команда в левой части была выполнена успешно.

$ echo hello && echo goodbye
hello
goodbye

[Использование ;]

Оператор ; позволяет вам запустить несколько команд в одной строке команды. Он просто отделит отдельные команды друг от друга, благодаря чему они будут запускаться последовательно, одна за одной.

$ sleep 3; echo 1; sleep 2; echo 2; sleep 1; echo 3
1
2
3

[Использование !]

Оператор ! (отрицание) позволяет выразить исключение при вводе команд. В примере ниже создаются файлы 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.

 

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


Защитный код
Обновить

Top of Page