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
, являются некоторыми (из многих ) баны моей жизни.