chdir () в домашний каталог - PullRequest
       38

chdir () в домашний каталог

16 голосов
/ 29 февраля 2012

Я использую функцию chdir() C, чтобы позволить пользователю сменить каталог.

Функция, однако, не распознает '~'. Нужно ли делать какие-либо явные преобразования, чтобы chdir не распознал, что означает ~? Потому что мой не работает. Или я что-то не так делаю?

Ответы [ 2 ]

24 голосов
/ 29 февраля 2012

Расширение тильды обрабатывается оболочкой, а не системным вызовом.Вы можете использовать getenv(), чтобы прочитать переменную среды HOME, а затем использовать ее в качестве аргумента для chdir().

. Существуют системные вызовы для получения этой информации, которая может быть более надежной в отдельной системе,но они не полностью переносимы.Посмотрите, например, на getpwuid ().

10 голосов
/ 29 февраля 2012

Обратите внимание, что POSIX определяет семантику расширения тильды:

2.6.1 Расширение тильды

«Префикс тильды» состоит из не заключенных в кавычки <tilde> символ в начале слова, за которым следуют все символы, предшествующие первой без кавычки <slash> в слове, или все символы в слове, если <slash> отсутствует.В назначении (см. Назначение переменной XBD) можно использовать несколько префиксов тильды: в начале слова (то есть после <equals-sign> присвоения), после любого без кавычек <colon> или обоих.Префикс тильды в назначении заканчивается первым без кавычек <colon> или <slash>.Если ни один из символов в префиксе тильды не заключен в кавычки, символы в префиксе тильды, следующие за <tilde>, рассматриваются как возможное имя для входа в систему из пользовательской базы данных.Переносимое имя для входа в систему не может содержать символы вне набора, указанного в описании переменной среды LOGNAME в других переменных среды XBD.Если логин имеет нулевое значение (т. Е. Префикс тильды содержит только тильду), префикс тильды заменяется значением переменной HOME.Если HOME не установлено, результаты не уточняются.В противном случае префикс тильды должен быть заменен путем к исходному рабочему каталогу, связанному с именем входа в систему, полученным с использованием функции getpwnam(), как определено в томе «Системные интерфейсы» POSIX.1-2008.Если система не распознает имя для входа, результаты не определены.

Обратите внимание, в частности, что если мое имя пользователя - me, результаты cd ~ и cd ~me могут не соответствоватьтак же!В частности, переменная окружения HOME может иметь значение, отличное от значения, возвращаемого getpwnam().Я использую эту технику (более 25) лет, чтобы установить HOME там, где я хочу, и несколько программ, которые не распознают разницу между cd ~ и cd ~me, являются одними (из многих) Изгнание моей жизни.

...