Легко упустить возможности и динамику Bash, поэтому в этом цикле мы представим вам ряд советов, тонкостей и приёмов при использовнии Bash. Оболочка Bash - это разнообразный интерфейс оболочки с множеством возможностей программирования и богатым обучающим языком. Первые две статьи из этого цикла можно найти здесь: Полезные советы и фишки оболочки Bash, Часть 1 и здесь: Полезные советы и фишки оболочки Bash, Часть 2
В этом цикле статей вы узнаете:
- Полезные советы, приемы и методы работы с командной строкой Bash
- Как взаимодействовать с командной строкой Bash продвинутым образом
- Как отточить свои навыки работы с Bash в целом и стать более опытным пользователем Bash
Содержание:
- Требования к программному обеспечению и условные обозначения
- Правильная проверка существования файлов и каталогов
- Способ проверки существования файлов и каталогов получше
- Вы когда-нибудь хотели извлечь содержимое файла .deb?
- Заключение
Требования к программному обеспечению и условные обозначения
Категория | Требования или используемая версия программного обеспечения |
---|---|
Система | Свободные дистрибутивы 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 и оставляйте комментарии ниже с вашими находками!
Оригинал статьи можно найти здесь.

Sample bio text.