Сегодня будем проводить ректальное тестировать переменной PATH с помощью кишки.
( set -f; IFS=':'; for i in ${PATH:?'хуй с маслом'};do [[ -r "$i" && -d "$i/." ]] || echo "$i";done )Эта кишка проверяет элементы в переменной PATH. И выводит на экран которые не существуют, или к которым нет доступа на чтение.
Давай разберем каждый элемент отдельно:
set -f
Отключает функцию pathname expansion (или globbing). Это предотвращает интерпретацию символов
*, ? и [] как шаблонов имен файлов.IFS=':'
Устанавливает разделитель полей (Internal Field Separator, IFS) на двоеточие «:». Это необходимо для правильного разбора переменной PATH, где пути разделены двоеточием.
for i in ${PATH:?'хуй с маслом'}Запускает цикл for, который перебирает каждый элемент переменной PATH. Выражение
${PATH:?'empty path'} проверяет, что переменная PATH не пустая; если она пустая, выводится сообщение «хуй с маслом» и выполнение прерывается.do [[ -r "$i" && -d "$i/." ]] || echo "$i"; done
Внутри цикла проверяется каждый элемент «i» из PATH.
[[ -r "$i" && -d "$i/." ]]
Проверяет, существует ли каталог
(-d "$i/.") и доступен ли он для чтения (-r "$i").|| echo "$i"
Если каталог не существует или недоступен для чтения, то выводится значение «i» (путь).
Думаю более менее понятно. Если видишь огромную кишку, разбивай её на части и тогда с ней проще будет разобраться.
Это как в тайм-менеджмент, что-то там блядь про делёжку слона на маленькие кусочки.
В общем суть такая — если переменная PATH не установлена или пустая, команда завершится и будет выдано сообщение «хуй с маслом».
Поля переменной PATH отображаются на экран, если не соответствуют минимальным требованиям, или являются нулевыми. Bash будет искать в текущей директории.
man bash → PARAMETERS → Shell Variables → PATH
PATH The search path for commands. It is a colon-separated list of directories in which the shell looks for commands (see COMMAND EXECUTION below). A zero-length (null) directory name in the value of PATH indicates the current directory. A null directory name may appear as two adjacent colons, or as an initial or trailing colon. The default path is system-dependent, and is set by the administrator who installs bash. A common value is `/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin'
✔ Минимальные требования.
Каждый элемент пути должен иметь бит исполнения. Последний элемент должен быть каталогом и обладать разрешением на чтение, исполнение.
Для запуска программы достаточно, чтоб исполняемый файл программы имел бит исполнения и все каталоги в пути имели бит исполнения, чтения (не требуется если указываете полный путь до исполняемого файла).
У меня например после запуска кишки, выдало:
/snap/bin
Пошел смотреть и точно, в переменной PATH этот каталог указан, а физически его нет на диске.
Для исследования путей удобно использовать команду namei.
namei -m /etc
f: /etc
drwxr-xr-x /
drwxr-xr-x etc
Тему про PATH поднимал раннее в этом посте.
Ну а так вроде всё, изучай!
tags: #bash #linux
—
🔔 @bashdays