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

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

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

2 ответов


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

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


отметим, что POSIX задает семантику расширения Тильды:

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

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

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