fbpx
linux
29

Полезные советы и фишки оболочки Bash — Часть 2

0
(0)

В этой статье мы рассмотрим различные советы, приемы и примеры "фишек" оболочки Bash, которые помогут вам стать более продвинутым кодером и пользователем Bash. Bash позволяет вам учиться по ходу работы, что делает оболочку более приятной. Первую статью из нашего цикла можно найти здесь: Полезные советы и фишки оболочки Bash, Часть 1

В цикле статей вы узнаете:

  • Полезные советы, приемы и методы работы с командной строкой Bash
  • Как взаимодействовать с командной строкой Bash продвинутым образом
  • Как отточить свои навыки работы с Bash в целом и стать более опытным пользователем Bash

Содержание:

  1. Требования к программному обеспечению и условные обозначения
  2. Ловим этот обманчивый IP-адрес
  3. Подстановка имён файлов и необходимость правильного цитирования
  4. Заключение

Требования к программному обеспечению и условные обозначения

Категория Требования или используемая версия программного обеспечения
Система Свободные дистрибутивы GNU/Linux
Программное обеспечение Командная строка Bash, система на базе Linux
Другое Различные утилиты, которые либо включены в оболочку Bash по умолчанию, либо могут быть установлены с помощью sudo apt-get install tool-name (где tool-name представляет собой инструмент, который вы хотите установить)
Условные обозначения # - требует, чтобы заданные linux-команды выполнялись с правами root либо непосредственно от имени пользователя root, либо с помощью команды sudo.
$ - требует, чтобы заданные linux-команды выполнялись от имени обычного непривилегированного пользователя

Пример 1: Ловим этот обманчивый IP-адрес

Иногда нашим скриптам необходимо знать, какой IP-адрес у нашей машины. Существует несколько различных методов, хотя ни один из них не является полностью надежным. Например, наличие различных сетевых адаптеров на одном компьютере может привести к изменениям в выводах различных команд. Кроме того, некоторые команды имеют ограничения.

Например, команда hostname четко указывает в своем руководстве (для опции -I), что она отобразит все сетевые адреса хоста, но не будет делать никаких предположений о порядке вывода. Таким образом, использование команды hostname может оказаться не самым лучшим вариантом.

Приведенные здесь примеры призваны помочь вам и предоставить предложения по дальнейшему изучению и улучшению конкретной среды. Знание запрашиваемой машины или используемой сети позволит преобразовать эти команды в более надежные скрипты получения IP-адресов.

$ MYIP="$(ip a | grep 'inet.*global' | grep -v docker | sed 's|.*inet ||' | grep -o "^[\.0-9]\+")"; echo "${MYIP}"
10.10.0.20
$ MYIP="$(ip -s route get 1 | grep -o "src [\.0-9]\+" | grep -o "[\.0-9]\+")"; echo "${MYIP}"
10.10.0.20

В первой команде мы использовали ip a (IP-адрес), чтобы получить список всех IP-адресов, назначенных этой машине. Вы можете ввести команду ip a непосредственно в командной строке Bash, чтобы посмотреть, как выглядит результат.

Далее мы выполнили поиск по всем глобальным inet адаптерам и удалили из списка все сетевые подключения docker\а (Вышло не идеально; другие программы могут создавать другие сетевые интерфейсы, например, *ssh* или другие программы виртуализации, такие как *virtualbox`*, которые также потребуют фильтрации).

Затем мы обрабатываем входные данные с помощью sed, чтобы удалить информацию до inet. Наконец, мы ищем фактический IP с помощью команды grep only, т.е. grep -o, которая использует регулярное выражение для получения полного (IPv4) IP-адреса.

Вы также можете снова заметить, что здесь есть ограничения: как включить IP-адреса IPv6, как узнать основной IP-адрес при наличии нескольких адаптеров и т.д.

Во второй команде мы ищем первый маршрут на машине с помощью ip -s route get 1 и затем обрабатываем вывод аналогичным образом. Это потенциально более стабильный метод, позволяющий, по крайней мере, найти основной IPv4-адрес машины.

Сообщите нам в комментариях ниже ваш лучший метод получения IP и, возможно, основного IPv4-адреса с помощью сценариев Bash!


Пример 2: Подстановка имён файлов и необходимость правильного цитирования

Полезные советы Bash не заканчиваются. Двигаемся дальше!
В этом примере мы сначала создаем 3 файла, a, b и c, а затем запускаем дважды echo. Первая команда echo правильно выводит символ *, полученный в результате echo "*" внутри вложенной оболочки (дочерний командный интерпретатор) $(), в результате чего первое echo в команде выводит литерал *. Вторая команда echo не заключает * в кавычки должным образом, и в результате происходит Bash globbing; * воспринимается как идентификатор имени файла, файлы перечисляются и передаются в первый echo. Чтобы понять это, рассмотрим следующее:

$ echo *
a b c

Таким образом, мы видим необходимость всегда правильно заключать в кавычки любой текст, который может быть интерпретирован как имя файла, даже если такой текст уже правильно заключен в кавычки внутри вложенной оболочки, как в данном случае ($(echo "*"): обратите внимание на кавычки вокруг *).


Заключение

В этой статье мы рассмотрели, как получить IP-адрес с помощью различных методов, и рассмотрели возможность расширения этой возможности для различных сред. Мы также изучили подстановку имён в Bash (globbing) и необходимость правильно заключать в кавычки строки, которые могут быть интерпретированы как имена файлов, чтобы избежать путаницы.

Оригинал статьи можно найти здесь.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Сожалеем, что вы поставили низкую оценку!

Позвольте нам стать лучше!

Расскажите, как нам стать лучше?

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Заполните поле
Заполните поле
Пожалуйста, введите корректный адрес email.
Вы должны согласиться с условиями для продолжения

Читают сейчас
Меню

Попробуй курс Linux и DevOPS