Се­год­ня я рас­ска­жу, как понять Bash, научить­ся читать чужие коман­ды и писать свои. Прой­дем путь от самых основ до запус­ка пол­ноцен­ного ска­нера хос­тов и пор­тов. Если ты еще не зна­ешь, в чем раз­ница меж­ду && и ||, эта статья для тебя.

Bash (Bourne Again Shell) — это обо­лоч­ка для Unix и Linux, которая при­нима­ет твои тек­сто­вые коман­ды и переда­ет их опе­раци­онной сис­теме для выпол­нения. Bash — это не тер­минал и не скрипт. Вос­при­нимай его как интер­пре­татор коман­дно­го язы­ка, который уме­ет запус­кать коман­ды Linux и име­ет собс­твен­ную логику.

Тер­минал — это прог­рамма для инте­рак­тивно­го вза­имо­дей­ствия с сис­темой. Он нужен для удоб­ного вво­да команд и отоб­ражения резуль­татов. Цепоч­ка такая: тер­минал при­нима­ет коман­ду и переда­ет ее Bash, интер­пре­татор раз­бира­ет коман­ду и переда­ет ее опе­раци­онной сис­теме, а затем получа­ет резуль­тат и воз­вра­щает его поль­зовате­лю через тер­минал.

Bash мож­но исполь­зовать не толь­ко через тер­минал, но и в виде скрип­тов. Любую пос­ледова­тель­ность команд, вклю­чая вет­вле­ния if, цик­лы и так далее, можешь записать в файл и выпол­нять как обыч­ную прог­рамму. Затем выпол­ни chmod +x, что­бы файл стал исполня­емым. Не забудь добавить в начало фай­ла «шебанг» (shebang): он сооб­щит Linux, как интер­пре­тиро­вать файл.

#!/bin/bash

Та­кие фай­лы называ­ют Bash-скрип­тами. В Linux и macOS, в отли­чие от Windows, скрип­ты могут называть­ся как угод­но и иметь любое рас­ширение. Глав­ное — не нарушать пра­вила име­нова­ния сис­темы. Но для удобс­тва скрип­товые фай­лы час­то име­ют рас­ширение .sh. Это не тре­бова­ние сис­темы, прос­то пра­вило хороше­го тона.

 

Это база

Лю­бая твоя коман­да в Linux и macOS воз­вра­щает код завер­шения. Это чис­ло от 0 до 255, которое ука­зыва­ет, успешно ли отра­бота­ла коман­да. Если вер­нулся 0, зна­чит, прог­рамма отра­бота­ла кор­рек­тно. В ином слу­чае про­изош­ла какая‑то ошиб­ка.

Эта циф­ра — клю­чевой момент в логике работы Bash. Ты неод­нократ­но видел коман­ды вро­де git clone ... && cd .... Это цепоч­ка вызовов, пос­тро­енная на булевой логике.

Вы­пол­ни любую коман­ду в тер­минале, а затем про­верь ее код завер­шения через echo $?. Нап­ример:

ls /etc/passwd
echo $?
ls /boo/moo
echo $?
Проверка кода завершения последней команды
Про­вер­ка кода завер­шения пос­ледней коман­ды

Пер­вая про­вер­ка вер­нет 0, вто­рая — 2. Двой­ка — это код ошиб­ки, с которым мож­но работать. Здесь важ­но не запутать­ся, ведь обыч­но 1 — это true, а 0 — false. В Bash 0 — это true, а любое чис­ло от 1 до 255 — false. Вве­ди в тер­минале сле­дующие коман­ды:

true
echo $?
false
echo $?
# Обрати внимание на двойные скобки, это нужно для перехода в математический контекст
((1>0))
echo $?
((1<0))
echo $?
Проверка true/false в Bash
Про­вер­ка true/false в Bash

Ско­рее все­го, ты встре­чал коман­ды, в которых есть && или две вер­тикаль­ные чер­ты ||. Опе­ратор && — это логичес­кое И. Коман­да пос­ле него выпол­няет­ся, толь­ко ког­да пре­дыду­щая завер­шилась успешно:

true && echo "Not bad"
false && echo "Tell them I'm a super hacker"

info

Не путай двой­ной амперсанд && с оди­ноч­ным &. Оди­ноч­ный амперсанд говорит Linux, что коман­ду нуж­но выпол­нить в фоновом режиме. Что­бы доб­рать­ся до про­ги, запущен­ной в фоне, исполь­зуй fg.

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

Пример логического И
При­мер логичес­кого И

Ко­ман­да || — это логичес­кое ИЛИ, она про­тиво­полож­на &&. При­меры:

false || echo "Mom was right—I'm a really smart guy!"
true || echo "Hey!"

Про­верим, есть ли на нашей машине интернет, пин­ганув пуб­личный DNS-сер­вер Google:

ping -c1 8.8.8.8 || echo "Oh no! I don't have Internet access."

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

echo "Maybe I'll become"; echo "\ta cool hacker?"
Пример последовательного выполнения команд
При­мер пос­ледова­тель­ного выпол­нения команд

Еще один вари­ант — запуск через оди­ноч­ную вер­тикаль­ную чер­ту |. Исполь­зуй его, если надо передать вывод одной коман­ды в дру­гую.

 

Перенаправления

Ты, воз­можно, слы­шал, что в Unix и Linux «всё есть файл». Любое устрой­ство, любая прог­рамма и про­чее вос­при­нима­ются сис­темой в виде фай­лов. Для это­го в ник­сах есть нес­коль­ко вир­туаль­ных фай­ловых сис­тем. Нуж­но рас­печатать дан­ные? Пиши в файл прин­тера — сис­тема раз­берет­ся, что с этим делать. То же самое с получе­нием дан­ных от устрой­ств: сис­тема поз­воля­ет читать информа­цию, как из фай­ла. Даже сер­финг в интерне­те без бра­узе­ра мож­но орга­низо­вать как работу с фай­лами.

Как работает пневмопочта
Как работа­ет пнев­мопоч­та

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

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

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

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

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

    Подписаться

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