Операторы в командной строке GNU/Linux

Иногда у любого пользователя GNU/Linux (если он или она хоть иногда работает в CLI) возникает необходимость быстренько выполнить одну команду, а сразу за ней — следующую. Но вот беда: иногда решение, выполнять ли вторую команду, напрямую зависит от того, каких результатов достигла первая. Например, ни в коем случае нельзя выполнять команду «Б», если «А» выдала ошибку, но если «А» все-таки успешно закончила свою деятельность, то «Б» выполнить просто необходимо! Можно ли это сделать одной-единственной строкой? Конечно, да — благодаря операторам!

Что такое операторы?

Представим иную ситуацию: вы не хотите, чтобы команда, которую вы собираетесь выполнить, «забивала» собой терминал, т.е. чтобы она блокировала работу с командной строкой фактом выполнения себя, любимой. Скажем, вы хотите запустить из эмулятора терминала редактор разделов носителей информации gparted, а затем в том же окне терминала вывести на экран screenfetch. Однако gparted, запустившись, полностью «прикарманил» ваше окно терминала и не позволяет выполнить следующую команду…

Запускаем gparted:

gparted-pkexec

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

Еще операторы иногда называют разделителями (укр. «розділювач»), что, возможно, не совсем верно, но очень удобно!

На самом деле, их достаточно много, но я познакомлю вас с тремя самыми важными: &, ; и |.

Оператор &

Этот оператор попожет нам в случаях, когда программа своем выполнением полностью блокирует окно терминала. Использовав оператор & после команды, мы можем перевести ее выполнение в фон. Вот, как это работает на примере с gparted.

gparted-pkexec &

Обратите внимание, что после запуска программы в фоне она не перестает посылать сообщения в сеанс терминала, в котором работает. На первый взгляд может даже показаться, что терминал «забит» ею. Однако простое нажатие «Enter» опять выводит на экран приглашение командной строки, а посему ничто не мешает вам работать с этим окном дальше!

Кроме всего прочего, сразу после выполнения какой-либо команды с оператором & в конце в окне терминала появится его PID, по которому работающую в фоне программу легко найти в дереве процессов и, соотвествено, завершить.

Оператор & в конце команды переводит ее выполнение в фоновый режим. Постарайтесь это запомнить. Повертье, не раз и не два это знание придет вам на помощь! cool

А еще этот оператор позволяет запустить несколько команд одновременно! Для этого их нужно вписать последовательно, разделяя &:

Разделитель &&

Вероятно, по нензнанию можно решить, что && загоняет процесс куда-то еще глубже. lol Но нет, тут все не так просто, а уж к сожалению ли иль к счастью — решайте сами. smile

Помните первую ситуацию-пример — ту, где вам нужно выполнить последовательно несколько команд, однако каждая сдедующая должна начать работу только после того, как закончила предыдущая и если она при этом не выбила ошибку?

Давайте для интереса обновим список ПО, доступного в репозиториях мего Debian GNU/Linux, а потом сразу же и обновим систему? Воспользуемся для этого разделителем &&:

sudo apt update && sudo apt full-upgrade -y

Как видите, система последовательно выполнила две команды, обе — успешно. Обновлять, конечно, мне нечего — все и так новое, — но команды сработали именно так, как нам и хотелось.

Для закрепления знаний давайте зададим системе последовательно две команды, первая из которых будет полным бредом и, конечно же, выдаст ошибку, а вторая выведет на экран фразу «Читайте LinuxTheBest.net!».

fjsdfksjdflk && echo 'Читайте LinuxTheBest.net!'

Естественно, вторая команда так и не сработала, ибо «споткнулась» первая.

А вот если мы поменяем их местами — результат будет другой. Все потому, что в этом случае первая команда успешно выполнилась, ну а вторая… это и так понятно. oops

echo 'Читайте LinuxTheBest.net!' && fjsdfksjdflk

Так вы можете объеденять в огромные цепочки очень много команд — столько, сколько вам будет нужно. Например, вот вам шпаргалочка, как быстро обновить, а затем почистить ваш Debian-подобный дистрибутив от разного мусора:

sudo apt update && sudo apt full-upgrade -y && sudo apt autoremove -y && sudo apt autoclean

Можете не благодарить. cool

Оператор ;

Если && предусматривает выполнение следующей команды только в случае успешного выполнения предыдущей, то ; плевать хотела, что вообще происходило раньше. Оператор ; придет на помощь тогда, когда нужно выполнить последовательно несколько команд, однако не имеет значения, закончится ли выполнение какой-либо из них ошибкой. Например, вот так:

fgdjhkgkdfjhg ; dshfkjsdhfkjh ; echo 'Читайте LinuxTheBest.net!'

Система все равно выведет в терминал фразу «Читайте LinuxTheBest.net», потому что не обращает внимания на огрехи в работе предыдущих команд.

В случае, если все без исключения команды сработают нормально, ; превратится в аналог &&, как понимаете. Однако между ними существует огромная разница, про которую не нужно забывать! evil

Оператор |

Если кто не понял, этот символ — вертикальная черта. Не латинские «l» и «I», а именно |. Найдите ее на клавиатуре, хотя настоящий линуксоид ее использует частенько и, возможно, уже даже стер краску на соответсвующей клавише. smile

Этот оператор используется очень много где. Например, он может помочь, если нужно вывод первой команды использовать как ввод для следующей. Грубо говоря, таким образом вы можете, например, найти какое-либо слово в тексте — достаточно подключить grep:

Разделитель ||

…А вот разделитель команд || имеет достаточно интересное действие — полностью противоположное уже знакомому &&! То бишь, следующая команда сработает только в том случае, если предыдущая выдает ошибку. Например:

echo 'Который уже раз прошу читать LinuxTheBest.net!' || sudo apt update

В этом случае до команды «sudo apt update» дело так и не дойдет, поскольку предыдущая не закончилась ошибкой.

А теперь давайте попробуем выполнить сначала дурацкую, обреченную на ошибку команду, а за ней уже обновим список версий доступного ПО из репозиториев:

whatthehell || sudo apt update

В этом случае все наоборот: команда «sudo apt update» сработала только потому, что предыдущая выполнилась с ошибкой.

Выводы

Надеюсь, вы будете пользоваться операторами &, &&, ;, |, || и другими, о которых мне еще предстоит писать. grin  Конечно же, вы можете комбинировать разные разделители! Давайте для полного понимания попробуем перевести на язык CLI GNU/Linux такую фразу:

«Пожалуйста, дорогой пингвин, обнови мне список имеющегося в репозиториях ПО, а затем, если у тебя это получится, обнови всю мою систему. Если обновление будет успешным — выключи компьютер, а если нет — оставь включенным, но выйди из терминала!».

Сможете? Ваши варианты — в комментарии! wink Так и вечер весело проведем, и чего-то нового научимся. Вперед!

Кстати, я упоминал про разделители в одном из своих видео, где учил подписчиков своего канала закреплять alias в системе навсегда. Оно — на украинском языке, как и все остальные мои видео.

Благодарю вас за чтение и надеюсь, что ответил на все вопросы, которые могли возникнуть в процессе ознакомления! Если нет — пишите там же, в комментариях!

Напоминаю про конкурс, в котором вы все еще успеваете принять участие. У нас уже 18 работ, и все действительно классные. Попробуйте свои силы и вы! cool

Автор: root
Изображения: из открытых источников, скриншоты автора
Видео: Ukrainian Liberation

Автор публикации

не в сети 58 минут

root

0
Адміністратор сайту «LinuxTheBest»
Комментарии: 232Публикации: 65Регистрация: 11-01-2019
Если Вам понравилась статья, то поделитесь ею в соц.сетях:

11
Отправить ответ

 
avatar
 
smilegrinwinkmrgreenneutraltwistedarrowshockunamusedcooleviloopsrazzrollcryeeklolmadsadexclamationquestionideahmmbegwhewchucklesillyenvyshutmouth
Фото и картинки
 
 
 
Другие файлы
 
 
 
6 Темы
5 Ответов
5 Комментаторов
 
Самый обсуждаемый
Горячие комментарии
6 Авторы комментариев
rootglebchedrsergey.siryymihail.tolochko Последние авторы комментариев
agafron
Участник

А еще есть оператор “!!” два восклицательных знака, который повторяет предыдущую команду с дополнительными опциями, например, копируешь какую-нибуть команду с форума
any Long Command Bla Bla --Bla , а тебе в ответ You need to be root to run this command
делаешь sudo !! и вуаля, твоя командна выполняется от рута

trackback

[…] долгая команда, составленная из нескольких благодаря разделителям, сделает все за […]

gleb
Участник

А можно к видео субтитры русские прикрутить?

chedr
Участник

…жаль, что на сайте нет опции типа “лайк” статье))

mihail.tolochko
Гость

Литр горилки и все дела smile

Slipknot
Участник
Slipknot

Очень круто спасибо люблю bash
Интересно узнать разницу между
Bash sh zsh

Авторизация
*
*
 
Регистрация
*
*
*
*
 
Генерация пароля