TGViewer
Bash Days | Linux | DevOps Bash Days | Linux | DevOps @bashdays · 23.6K subscribers
Post #465 13.4K
Не переношу жару, черт его знает как в детстве мы сидели во дворе и пили водку на солнце в +45 градусов, сейчас бы я так не смог.

Сегодня будем проводить ректальное тестировать переменной 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
More from @bashdays
  1. Sep 30, 2026↗️ Для всех, кто строит 15 октября Cloud․ru соберет инженеров, которые строят и эксплуатир…
  2. Sep 29, 2026Самый жаркий холивар в команде — это не systemd, а какие заказать роллы на всю команду. Од…
  3. Sep 24, 2026Post #1565
  4. Sep 23, 2026Здрасти приехали, решил я в кой-то веке воспользоваться услугами Codex, создал аккаунт, по…
  5. Sep 22, 2026Всем привет, с вами TagdTagd. Сегодня опять поднимем тему архивов, но немного с другой сто…
  6. Sep 15, 2026Всем привет, с вами TagdTagd. И это вторая часть. Практическая. С первой частью можешь озн…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →