Какие крайние случаи мы должны учитывать при разборе $ PATH в Linux? - PullRequest
7 голосов
/ 19 августа 2011

Я работаю над приложением на C, которое должно пройти $ PATH, чтобы найти полные пути для двоичных файлов, и единственная разрешенная зависимость - это glibc (то есть, никаких вызывающих внешних программ, подобных которым).В обычном случае это просто влечет за собой разбиение getenv («PATH») по двоеточиям и проверку каждого каталога по одному, но я хочу быть уверенным, что рассмотрю все возможные варианты углов.Какие ошибки я должен высматривать?В частности, относительные пути, пути, начинающиеся с ~, должны быть расширены до $ HOME, или пути, содержащие: char allow?

Ответы [ 4 ]

11 голосов
/ 19 августа 2011

Одна вещь, которая однажды меня удивила, это то, что пустая строка в PATH означает текущий каталог.Два соседних двоеточия или двоеточие в конце или начале PATH означает, что текущий каталог включен.Это задокументировано, например, в man bash .

Также в спецификации POSIX .

Итак

PATH=:/bin
PATH=/bin:
PATH=/bin::/usr/bin

Все означают, что текущий каталог находится в PATH

2 голосов
/ 19 августа 2011

Я не уверен, что это проблема с Linux в целом, но убедитесь, что ваш код работает, если PATH имеет некоторую причудливую (например, UTF-8) кодировку для работы с каталогами с причудливыми буквами.Я подозреваю, что это может зависеть от кодировки файловой системы.

Я помню, как работал над сообщением об ошибке какого-то русского парня, у которого в имени пользователя были причудливые буквы (и, следовательно, имя его домашнего каталога, которое появилось в PATH).

1 голос
/ 01 сентября 2011

Существующие ответы охватывают большую часть этого вопроса, но стоит охватить части вопроса, на которые еще не ответили:

  1. $ и ~ не являются специальными в значении $ PATH.
  2. Если $ PATH вообще не установлен, execvp() будет использовать значение по умолчанию.
1 голос
/ 19 августа 2011

Это незначительно, но я добавлю его, так как оно еще не было упомянуто. $ PATH может включать как абсолютные, так и относительные пути. Если вы сканируете список путей, используя chdir (2) в каждом каталоге, вам нужно отслеживать исходный рабочий каталог (getcwd (3)) и chdir (2) обратно к нему на каждой итерации сканирования.

...