Подтвердить что ты не робот

Как избежать двоеточия (:) в $PATH на UNIX?

Мне нужно проанализировать переменную среды $PATH в моем приложении. Поэтому мне было интересно, какие escape-символы будут действительны в $PATH. Я создал тестовый каталог под названием /bin:d и создал тестовый script funny внутри него. Он работает, если я назову его абсолютным путем. Я просто не могу понять, как избежать : в $PATH. Я попытался убежать двоеточие с \ и обертывание его в одиночные кавычки ' и double ". Но всегда, когда я запускаю which funny, он не может его найти. Я запускаю CentOS 6.

4b9b3361

Ответ 1

Это невозможно в соответствии с стандартом POSIX. Это не функция конкретной оболочки, обработка PATH выполняется внутри функции execvp в библиотеке C. Нет никаких условий для цитирования.

Вот почему включать некоторые символы (что-то не в "наборе символов переносного файла" - в качестве примера вызывается двоеточие.) настоятельно рекомендуется против.

От SUSv7:

Так как <colon> является разделителем в этом контексте, имена каталогов, которые могут использоваться в PATH, не должны содержать символ <colon>.

См. также источник GLIBC execvp. Мы видим, что он использует функции strchrnul и memcpy для обработки компонентов PATH, без каких-либо условий для пропуска или отмены любого типа escape-символа.

Ответ 2

Глядя на функцию extract_colon_unit мне кажется, что это невозможно. : безоговорочно и неизбежно используется в качестве разделителя путей.

Ну, это действительно, по крайней мере, для bash. Другие оболочки могут различаться.

Ответ 3

Вы можете попробовать mount ing it

mount /bin:d /bind
PATH=/bind

Ответ 4

Согласно http://tldp.org/LDP/abs/html/special-chars.html одинарные кавычки должны сохранять все специальные символы, поэтому, не пытаясь этого, я думаю, что '/bin: d' будет работать (с) в $PATH.