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

info

Ри­чар­да Стол­лма­на я, конеч­но, ува­жаю, но под­нимать тему наз­вания Linux vs GNU/Linux я в оче­ред­ной раз не буду. Мы пишем Linux, ты понимай, как тебе бли­же.

Кон­соль — это вов­се не прок­лятие Linux, а его глав­ное дос­тоинс­тво. Пока ты не осво­ишь работу в ней, ты не пой­мешь филосо­фию Unix и будешь счи­тать ник­сы недовин­дой. Не нуж­но вос­при­нимать эму­лятор тер­минала как какой‑то арха­ичный интерфейс. Это и есть основной и впол­не сов­ремен­ный, а окош­ки — это надс­трой­ка.

Прак­тичес­ки все, что мож­но делать в гра­фике, мож­но делать и в кон­соли тоже. Да, тыкать мыш­кой лег­че, но, ког­да понадо­бит­ся сде­лать сот­ни или тысячи одно­тип­ных дей­ствий, понима­ние кон­соли сра­зу же сэконо­мит тебе кучу вре­мени.

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

info

Ба­зовые зна­ния о Linux ты можешь почер­пнуть из статьи «Linux за 30 минут. Руководс­тво по выбору и исполь­зованию Linux для нович­ков». Мы же углу­бим­ся имен­но в работу с кон­солью и ее воз­можнос­ти.

За­мет­ная часть повес­тво­вания будет отно­сить­ся к обра­бот­ке тек­стов. Я буду давать мно­го при­меров из сво­ей прак­тики, а прак­тика моя тес­но свя­зана с рас­четами.

info

Боль­шая часть кван­тово‑химичес­кого соф­та ори­енти­рова­на на работу в кон­соли, и, если чуть пораз­мыслить, ста­новит­ся ясно почему. Ресур­сы для подоб­ных вычис­лений тре­буют­ся порой фан­тасти­чес­кие, сами вычис­ления могут длить­ся дня­ми и неделя­ми. Само собой, машины, на которых это про­исхо­дит, сугубо ста­ционар­ные, а час­то это клас­теры. Визу­аль­ную обо­лоч­ку на них обыч­но не ста­вят вов­се — за ненадоб­ностью. К таким машинам не набега­ешь­ся, поэто­му дос­туп обыч­но идет по SSH, при­чем дер­жать тон­нель под­нятым дня­ми и неделя­ми неразум­но. Поэто­му типич­ный сце­нарий такой: под­клю­чаем­ся, запус­каем про­цесс в фоне, резуль­тат пишем в файл, отклю­чаем­ся, воз­вра­щаем­ся, ког­да пос­чита­ет, ана­лизи­руем тек­сто­вый вывод.

 

Обустраиваемся

Что­бы ощу­тить все фиш­ки кон­соли, для начала надо их акти­виро­вать. В некото­рых дис­три­бути­вах «из короб­ки» нас­тро­ены некото­рые плюш­ки, но я буду исхо­дить из того, что это не наш слу­чай.

Пер­во‑напер­во рекомен­дую в качес­тве обо­лоч­ки пос­тавить Zsh и вклю­чить авто­допол­нение, под­свет­ку син­такси­са и авто­обра­бот­ку неиз­вес­тных команд с исполь­зовани­ем pkgfile. Темы и офор­мле­ние уже мож­но выбирать по собс­твен­ному вку­су, в ине­те пол­но готовых кон­фигов.

Под­свет­ка син­такси­са облегчит визу­аль­ное вос­при­ятие, а авто­допол­нение сде­лает работу быс­трее. Дос­таточ­но наб­рать пер­вые бук­вы, нажать Tab, и наз­вание коман­ды или дирек­тории будет допол­нено. Ког­да зна­ешь, где у тебя что лежит, доб­рать­ся получа­ется даже быс­трее, чем с мышью.

Под­свет­ку син­такси­са мож­но вклю­чить и в кон­соль­ных тек­сто­вых редак­торах, нап­ример nano. Тоже очень помога­ет в работе.

 

Циклы

Итак, Shell — это пол­ноцен­ный язык прог­рамми­рова­ния, и, работая в кон­соли, очень удоб­но исполь­зовать однос­троч­ные скрип­ты. Нап­ример, исполь­зуя цикл for, мож­но пере­име­новы­вать фай­лы по шаб­лону:

# Создаем десять пустых файлов txt
$for i in {0..10};do touch file"$i".txt;done
$ls -1
file0.txt
file10.txt
file1.txt
file2.txt
file3.txt
file4.txt
file5.txt
file6.txt
file7.txt
file8.txt
file9.txt
# Меняем расширение всем файлам txt на png
$for i in *txt;do mv $i ${i%txt}png;done
$ls -1
file0.png
file10.png
file1.png
file2.png
file3.png
file4.png
file5.png
file6.png
file7.png
file8.png
file9.png

В этом при­мере мож­но уви­деть сра­зу нес­коль­ко удоб­ных при­емов. Во‑пер­вых, перебор чисел от 0 до 10 (for i in {0..10};) и исполь­зование дан­ных зна­чений для име­нова­ния фай­лов (touch file"$i".txt). Во‑вто­рых, офор­мле­ние бло­ков кода (от do до done).

info

Син­таксис в раз­ных диалек­тах Shell нес­коль­ко раз­лича­ется. Все пред­став­ленное здесь спра­вед­ливо для Zsh и Bash — их син­таксис сов­местим. Одна­ко в дру­гих обо­лоч­ках (нап­ример, Fish или Elvish) некото­рые конс­трук­ции могут не работать.

В‑треть­их — исполь­зование мас­ки *txt, по которой под­став­ляют­ся име­на всех фай­лов в дан­ной дирек­тории, окан­чива­ющих­ся на txt. При помощи мас­ки мы из мно­жес­тва фай­лов выбира­ем некото­рые, под­пада­ющие под шаб­лон.

Глобы и регэксы

Мас­ки (они же «шаб­лоны под­ста­нов­ки» или «гло­бы», glob) — это самый прос­той вид задания пат­тернов. Их син­таксис прост: ? — один любой сим­вол, * — любое чис­ло любых сим­волов, [abc] — один из перечис­ленных, [a-z] — один сим­вол из диапа­зона плюс еще нес­коль­ко подоб­ных пра­вил.

Су­щес­тву­ет более прод­винутая вер­сия — регуляр­ные выраже­ния (regex). Их уже мож­но исполь­зовать для поис­ка и замены пат­тернов прак­тичес­ки любой слож­ности. В Bash, что­бы узнать, под­пада­ет ли стро­ка под пат­терн, задан­ный регуляр­ным выраже­нием, исполь­зует­ся спе­циаль­ный опе­ратор =~. Нап­ример: [[ "abc123" =~ [a-z]+[0-9]+ ]].

Од­нако в Bash реали­зация регэк­сов непол­ная. Если понадо­бит­ся вся их мощь, луч­ше обра­тить­ся к спе­циаль­ным коман­дам вро­де grep, sed и awk (их мож­но выз­вать пря­мо из Bash — об этом ниже) и скрип­товым язы­кам типа Perl и Python. Так­же регуляр­ки мож­но исполь­зовать для поис­ка и замены тек­ста во мно­гих редак­торах кода — от vi до VS Code.

Ну и пос­леднее — это работа со стро­ками. Конс­трук­ция ${i%txt}png озна­чает, что опе­ратор % ищет сов­падение с шаб­лоном, начиная с кон­ца стро­ки, и уда­ляет най­ден­ные фраг­менты. Если исполь­зовать опе­ратор #, то поиск будет идти с начала.

Об­рати вни­мание, что в этом выраже­нии зна­чение перемен­ной под­став­ляет­ся так: сна­чала знак дол­лара, а затем имя перемен­ной в фигур­ных скоб­ках. Это может быть неп­ривыч­но в срав­нении с дру­гими язы­ками прог­рамми­рова­ния. Ну а текст png прос­то дописы­вает­ся в конец, незави­симо от резуль­тата обра­бот­ки стро­ки.

Наз­вание «однос­троч­ные скрип­ты» (или «однос­троч­ники») весь­ма условное: здесь вмес­то новой стро­ки прос­то исполь­зует­ся точ­ка с запятой, что поз­воля­ет объ­еди­нить три стро­ки в одну. Так мож­но соб­рать длин­ную пос­ледова­тель­ность команд и потом встав­лять в тер­минал одной стро­кой. Но если стро­ка выходит сов­сем уж гро­моз­дкой, луч­ше офор­мить ее как отдель­ный скрипт. Так будет про­ще пра­вить и отла­живать. Да и кровь из глаз не пой­дет.

warning

При написа­нии однос­троч­ных скрип­тов, занима­ющих­ся пере­име­нова­нием, уда­лени­ем и дру­гими потен­циаль­но необ­ратимы­ми дей­стви­ями, край­не полез­но сде­лать пер­вый холос­той запуск. Нап­ример, добавив перед целевой коман­дой echo. Это поз­волит про­верить, все ли работа­ет так, как ожи­дает­ся. В осо­бо ответс­твен­ных слу­чаях сто­ит и о бэкапе подумать. Пом­ни — лиш­ний про­бел в удач­ном мес­те при удач­ном сте­чении обсто­ятель­ств может снес­ти полови­ну сис­темы, как было в свое вре­мя с обновле­нием «Яндекс Дис­ка». Будь вни­мате­лен!

 

Unix-way

Кон­цепция «все есть файл» в Unix-сис­темах нераз­рывно свя­зана с перенап­равле­нием вывода и пай­пами (они же «тру­бы» и «кон­вей­еры»). Собс­твен­но, эти механиз­мы и поз­воля­ют реали­зовать прин­цип KISS (keep it simple, stupid — «делай про­ще, дурачок»). Зак­люча­ется он в том, что в сис­теме мно­го отдель­ных ути­лит, каж­дая из которых дела­ет хорошо что‑то одно, а вмес­те из них мож­но соб­рать сколь угод­но слож­ные и мощ­ные ком­бинации.

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

А что делать, если коман­да исполь­зовалась дав­но? Про­маты­вать исто­рию из десят­ков команд неудоб­но. Но исто­рия команд — это прос­то файл ~/.bash_history: его мож­но пос­мотреть вруч­ную или исполь­зовать ути­литу history, которая выводит спи­сок из десят­ка пос­ледних команд с их номера­ми.

Удоб­но: взгля­нул на спи­сок, нашел нуж­ную строч­ку, даже копиро­вать не надо. Прос­то набира­ем !номер_команды, жмем Enter, и коман­да вновь выпол­нится. А если нажать Tab, то раз­вернет­ся до удоб­ного для чте­ния вида, и ее мож­но будет под­редак­тировать при необ­ходимос­ти.

А если коман­да далеко в исто­рии? Нет проб­лем, исполь­зуем history -N, где N — чис­ло пре­дыду­щих команд, которые надо отоб­разить. Так мож­но прос­ледить вплоть до уста­нов­ки сис­темы.

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

 

Пайпы

Тут нам помогут пай­пы и ути­лита grep! Пред­ста­вим, что ты вспом­нил часть коман­ды и хочешь поис­кать по этой стро­ке. Нап­ример, можем по стро­ке for поис­кать скрипт, который мы писали в начале статьи.

history -10000|grep "for i"
...
11654 for i in {0..10};do touch file"i".txt;done
11657 for i in *txt;do echo
i {i%txt}png;done
11658 for i in *txt;do mv
i ${i%txt}png;done

Ути­лита grep ищет стро­ки, под­ходящие под шаб­лон. Здесь, кста­ти, исполь­зуют­ся уже не прос­то мас­ки, а пол­ноцен­ные регуляр­ные выраже­ния.

Сим­вол пай­па | тут переда­ет вывод коман­ды history на ввод ути­литы grep — это и есть пайп. Хочешь в най­ден­ном поис­кать еще раз? Прос­то добав­ляешь еще пайп и еще grep с новым шаб­лоном! И так мож­но соеди­нять сколь­ко угод­но раз и любые коман­ды.

 

Перенаправление вывода и tee

Еще ты можешь перенап­равить вывод коман­ды в файл. Нап­ример, если в кон­це нашего поис­ка добавить > results.txt, то вывод вмес­то отоб­ражения в кон­соли будет записан в ука­зан­ный файл. Если нуж­но дописать в файл, не тро­гая его содер­жимое, то исполь­зуют­ся уже две тре­уголь­ные скоб­ки — нап­ример, echo "Еще одна строка" >> summary.txt.

А что, если нуж­но и выводить на экран, и писать в файл? Для это­го есть замеча­тель­ная ути­лита tee. Без парамет­ров она соз­даст новый файл, а с клю­чом -a допишет в сущес­тву­ющий.

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    6 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии