fbpx
linux
25

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

0
(0)

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

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

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

Содержание:

  1. Требования к программному обеспечению и условные обозначения
  2. Правильная проверка существования файлов и каталогов
  3. Способ проверки существования файлов и каталогов получше
  4. Вы когда-нибудь хотели извлечь содержимое файла .deb?
  5. Заключение

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

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

Пример 1: Правильная проверка существования файлов и каталогов

Мы можем довольно легко проверить наличие каталога, используя в операторе if флаг -d (существует ли каталог с указанным именем):

$ MYPATHTOCHECKFOREXISTENCE="${PWD}"
$ echo "${MYPATHTOCHECKFOREXISTENCE}"
/home/roel/iamhappy
$ if [ -d ${MYPATHTOCHECKFOREXISTENCE} ]; then echo "Exists!"; fi
Exists!

Однако в некоторых моментах в Bash так же легко допустить ошибку, которую позже будет тяжело заметить. Давайте рассмотрим пример (и посмотрим, сможете ли вы найти ошибку);

$ MYPATHTOCHECKFOREXISTANCE="/doesnotreallyexist"
$ if [ -d ${MYPATHTOCHECKFOREXISTENCE} ]; then echo "Exists!"; fi
Exists!
$ ls /doesnotreallyexist
ls: cannot access '/doesnotreallyexist': No such file or directory

Почему при проверке if делается вывод, что каталог /doesnotreallyexist существует? Можете ли вы увидеть ошибку?

Проблема в том, что в имени переменной допущена опечатка. EXISTANCE vs EXISTENCE...

Взглянем и на такой пример:

$ if [ -d ]; then echo "Exists!"; fi
Exists!

И что более примечательно:

$ VAR1=''; if [ -d ${VAR1} ]; then echo "Exists!"; fi
Exists!

Таким образом, если вы забыли инициализировать в переменной имя каталога, который вы впоследствии проверяете, или имя переменной написано неправильно, то результатом будет то, что оператор Bash if ответит, что каталог существует! Об этом интересном исключении ничего не говорится в руководстве (см. man Bash), которое лишь уточняет, что -d вернёт True, если файл существует и является каталогом.

Так как же нам это исправить?


Пример 2: Способ проверки существования файлов и каталогов получше

Исправить это просто: мы можем заключить нашу переменную в двойные кавычки (""), что приведет к тому, что if не будет всегда по умолчанию возвращать истину. В качестве интересного замечания для дальнейшего размышления, и, возможно, вашего компетентного комментария ниже на эту тему, следует задаться вопросом, почему это было реализовано именно так, и что лежит в основе реализации возврата всегда верного результата.

$ VAR1=''; if [ -d "${VAR1}" ]; then echo "Exists!"; fi
$

Простое и утончённое решение. Вместо того, чтобы оператор использовать if как if [ -d ], который, как мы видели, всегда оценивается как true по умолчанию при пустых переменных\неверных именах, лучше применить (при условии, что VAR1 по крайней мере пуст) if [ -d "" ], что приводит к false, и таким образом блок кода после then не выполняется.

Интересовались тем, как можно осуществить резервное копирование каталогов пользователя? Если ещё нет, то советуем прочесть нашу статью тут и тут.


Пример 3: Вы когда-нибудь хотели извлечь содержимое файла .deb?

Иногда в системе что-то ломается, и нам может понадобиться получить отдельный файл из пакета .deb. Пакеты .deb (установочные пакеты debian, используемые также в Ubuntu и Mint) можно легко найти в Интернете, но не всегда очевидно, как извлечь из них файлы. Для этого мы можем:

ar x some_deb_file.deb
tar -xf data.tar.xz

ar - это инструмент для создания, изменения и извлечения из архивов, как объясняет руководство (man ar). Эти команды позволят получить файлы внутри пакета .deb. Каждый файл .deb будет содержать два архивных файла, а именно control.tar.xz и data.tar.xz (обычный стандарт), и - как видно из примера - именно архив data.tar.xz нужно распаковать, чтобы увидеть файлы внутри пакета .deb.


Заключение

В этой статье мы рассмотрели способы правильной проверки существования файлов и каталогов с использованием кавычек для исключения возврата True по умолчанию с пустыми переменными или с неправильным именем, а также показали, как легко допустить ошибки в этой области. Всегда тестируйте свои скрипты и пробуйте различные ситуации и варианты. Мы также рассмотрели, как можно извлечь содержимое из .deb-файла с помощью команд ar и tar. Как всегда, наслаждайтесь кодированием Bash и оставляйте комментарии ниже с вашими находками!

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

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

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

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

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

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

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

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

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

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

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

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

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