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

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

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


person darksky    schedule 29.02.2012    source источник
comment
Когда вам нужно расширить ~username, вам нужно будет использовать getpwnam() вместо getpwuid(), чтобы найти домашний каталог.   -  person Jonathan Leffler    schedule 29.02.2012


Ответы (2)


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

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

person Ernest Friedman-Hill    schedule 29.02.2012
comment
Гарантируется ли, что chdir() не сработает, если аргумент равен NULL? Если да, то все в порядке; в противном случае не помешала бы небольшая проверка ошибок! - person Ernest Friedman-Hill; 29.02.2012
comment
Это не приведет к сбою, но, безусловно, произойдет сбой, о котором вы, возможно, захотите узнать. - person Brian Roach; 29.02.2012
comment
Гарантии нет, насколько я знаю. - person R.. GitHub STOP HELPING ICE; 29.02.2012
comment
Вот фрагмент кода для тех, кто хочет использовать последний метод. jonathonhill.net/2013-09-03/tilde-expansion-in -php - person Jonathon Hill; 03.09.2013

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

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

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

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

person Jonathan Leffler    schedule 29.02.2012
comment
+1 за указание на то, что ~ и ~me ссылаются на разные источники для выполнения своей работы - полезно знать. Но хотя POSIX определяет расширение с помощью тильды, оно находится в главе о оболочках, а не о системных вызовах. - person ; 06.04.2013