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