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