помощью 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 есть некоторые (из многих) бэйнов моей жизни.
