Chdir() в домашнюю директорию

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

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

Ответ 1

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

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

Ответ 2

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

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

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

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