fbpx
linux
57

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

0
(0)

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

Эта серия статей, первую часть которой мы представляем сегодня, вооружит вас инструментами и методами, необходимыми для того, чтобы стать более опытным пользователем. А опытные пользователи наверняка почерпнут для себя что-то новое и интересное. Наслаждайтесь!


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

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

Содержание:

  1. Требования к программному обеспечению и условные обозначения
  2. Смотрим, какие процессы обращаются к определенному файлу
  3. Отладка ваших скриптов
  4. Типичная ошибка: sh -x != bash -x
  5. Уникальный или не уникальный - вот в чем вопрос!
  6. Заключение

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

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

Пример 1: Смотрим, какие процессы обращаются к определенному файлу

Вы хотите узнать, какие процессы обращаются к заданному файлу? Это легко сделать с помощью встроенной в Bash команды fuser:

$ fuser -a /usr/bin/gnome-calculator
/usr/bin/gnome-calculator: 619672e
$ ps -ef | grep 619672 | grep -v grep
abc       619672    3136  0 13:13 ?        00:00:01 gnome-calculator

Видно, что файл /usr/bin/gnome-calculator (двоичный), в настоящее время используется процессом с ID 619672. Проверив этот идентификатор процесса с помощью ps, мы вскоре узнаем, что пользователь abc запустил калькулятор и сделал это в 13:13.

Символ e после идентификатора процесса (PID) указывает на то, что это исполняемый файл. Существуют и другие подобные классификаторы, и вы можете использовать man fuser, чтобы увидеть их. Продуктивность fuser можно повысить, если использовать этот инструмент в комбинации с lsof (ls открытых файлов):

Допустим, мы занимаемся отладкой удаленного компьютера для пользователя, который работает со стандартным рабочим столом Ubuntu. Пользователь запустил калькулятор, и теперь весь его экран застыл. Мы хотим удаленно убить все процессы, которые каким-либо образом связаны с заблокированным экраном, не перезагружая сервер, в порядке убывания значимости этих процессов.

# lsof | grep calculator | grep "share" | head -n1
xdg-deskt    3111                                 abc  mem       REG              253,1          3009   12327296 /usr/share/locale-langpack/en_AU/LC_MESSAGES/gnome-calculator.mo
# fuser -a /usr/share/locale-langpack/en_AU/LC_MESSAGES/gnome-calculator.mo
/usr/share/locale-langpack/en_AU/LC_MESSAGES/gnome-calculator.mo:  3111m  3136m 619672m 1577230m

Сначала мы нашли все открытые файлы, используемые калькулятором, с помощью lsof. Чтобы сделать вывод коротким, показана только верхняя строка результата для одного общего файла. Затем мы использовали fuser, чтобы узнать, какие процессы используют этот файл. Это позволило нам получить PID. Наконец, мы выполнили поиск с помощью grep на основе OR (|), чтобы найти имена актуальных процессов. Мы видим, что в то время как Calculator был запущен в 13:13, другие процессы работают дольше.

Далее мы можем? например, выполнить kill -9 619672 и проверить, решило ли это проблему. Если нет, мы можем попробовать проделать то же с процессом 1577230 (общий файловый менеджер Nautilus), процессом 3136 (общая оболочка) или, наконец, процессом 3111, хотя это, скорее всего, уничтожит значительную часть рабочего стола пользователя и вряд ли легко перезапустится.


Уже скоро мы выпустим наш курс по Bash скриптам для начинающих! Жди новостей в нашем телеграмме! http://yodo.im/support

Пример 2: Отладка ваших скриптов

Итак, вы написали отличный скрипт с большим количеством сложного кода, затем запустили его... и увидели ошибку в выводе, которая на первый взгляд не имеет особого смысла. Даже после отладки в течение некоторого времени вы все еще не можете понять, что произошло во время выполнения скрипта. В оболочке bash есть отличный инструмент для такого случая.

На помощь приходит bash -x! bash -x позволяет выполнить скрипт test.sh и увидеть, что именно происходит:

#!/bin/bash
VAR1="Hello yodo.im readers!"
VAR2="------------------------------"
echo ${VAR1}
echo ${VAR2}

Выполнение:

$ bash -x ./test.sh
+ VAR1='Hello yodo.im readers!'
+ VAR2=------------------------------
+ echo Hello yodo.im 'readers!'
Hello yodo.im readers!
+ echo ------------------------------
------------------------------

Как вы можете видеть, команда bash -x показала нам, что именно произошло, шаг за шагом. Вы также можете легко отправить вывод этой команды в файл, добавив к команде 2>&1 | tee my_output.log:

Команда 2>&1 отправит stderr (стандартный вывод ошибок: любые ошибки, замеченные во время выполнения) в stdout (стандартный вывод: вывод, который вы обычно видите на терминале) и захватит весь вывод из bash -x. Команда tee перехватит весь вывод из stdout и запишет его в указанный файл. Если вы хотите добавить файл (а не начинать заново с пустого файла), вы можете использовать команду tee -a, где опция -a гарантирует, что файл будет добавлен.


Пример 3: Типичная ошибка: sh -x != bash -x

Последний пример показал нам, как использовать bash -x, но можем ли мы также использовать sh -x? Некоторые начинающие пользователи оболочка Bash склонны запускать sh -x, но это ошибка новичка; sh - гораздо более ограниченная оболочка. Хотя bash основан на sh, он имеет гораздо больше функциональности. Таким образом, если вы используете sh -x для отладки своих скриптов, то получите странные ошибки. Хотите увидеть пример?

#!/bin/bash

TEST="abc"
if [[ "${TEST}" == *"b"* ]]; then
  echo "Сюда мы добрались!"
fi

Выполнение:

Здесь представлен небольшой тестовый скрипт test.sh, который при выполнении проверяет, появляется ли определенная буква (b) в определенной входной строке (заданной в переменной TEST). Сценарий работает, и, когда мы используем bash -x, мы видим, что представленная информация, включая вывод, выглядит корректно.

Далее, при использовании sh -x появляются проблемы; оболочка sh не может интерпретировать [[ и "спотыкается" как в выводе sh -x, так и в самом выполнении скрипта. Это происходит потому, что расширенный синтаксис if, реализованный в bash, не существует в sh.


Пример 4: Уникальный или не уникальный - вот в чем вопрос!

Хотелось ли вам когда-нибудь отсортировать файл и вывести список только уникальных записей? На первый взгляд, это легко сделать с помощью входящей в состав оболочки Bash команды uniq:

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

$ cat input.txt 
3
1
2
3
2
3
3
3
$ cat input.txt | uniq
3
1
2
3
2
3

Это связано с тем, что по умолчанию uniq будет фильтровать соседние совпадающие строки, при этом совпадающие строки объединяются до первого появления, как поясняется в руководстве uniq. Или, другими словами, будут удалены только те строки, которые полностью совпадают с предыдущей.

В примере это видно по тому, что три последние строки 3 сворачиваются в одну "уникальную" 3. Вероятно, это можно использовать только в ограниченном количестве и специфических случаях.

Однако мы можем еще немного подправить uniq, чтобы получить только действительно уникальные записи, используя параметр -u:

$ cat input.txt  # Учтите, что '#' дописано уже после выполнения, чтобы далее обратить особое внимание на эти строки(читайте ниже)
3  #
1  #
2  #
3  #
2  #
3
3
3
$ cat input.txt | uniq -u 
3
1
2
3
2

Все еще немного странно, да? Посмотрите внимательно на ввод и вывод, и вы увидите, что выводятся только те строки, которые индивидуально (сравните с листингами выше) уникальны (как отмечено # в примере выше после выполнения).

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

Мы можем получить более подходящее решение для уникальности, используя немного другой встроенный инструмент Bash; sort:

А ВЫ ЗНАЛИ?

Вы можете опустить команду cat в приведенных выше примерах и предоставить файл для чтения к uniq или sort напрямую? Пример: sort -u input.txt

Отлично! Это можно использовать во многих скриптах, где мы хотели бы получить настоящий список уникальных записей. Дополнительным преимуществом является то, что список одновременно хорошо сортируется (хотя мы, возможно, предпочли бы использовать опцию -n для сортировки и в числовом порядке в соответствии с числовым значением строки).


Заключение

Использование Bash в качестве предпочитаемой командной строки Linux приносит много пользы. Сегодня мы рассмотрели ряд полезных советов и приемов работы с командной строкой Bash. Это начало серии статей с примерами "фишек" командной строки Bash, которые, если вы будете следовать им, помогут вам стать гораздо более продвинутыми в командной строке и оболочке Bash!

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

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

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

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

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

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

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

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

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

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

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

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

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