реализация команды cd с использованием chdir() в linux

Я пишу свою собственную программу оболочки. В настоящее время я реализую команду cd, используя chdir. Я хочу реализовать chdir со следующими параметрами:

-P Не переходить по символическим ссылкам
-L Следовать по символическим ссылкам (по умолчанию)

Я разместил здесь вопрос , спрашивая, есть ли путь — это символическая ссылка или фактический путь. Но с этой информацией я не могу понять, как решить вышеуказанную проблему.

Спасибо


person hits_lucky    schedule 19.06.2010    source источник
comment
У вас есть хороший пример использования этой функции? Я не думаю, что какая-либо существующая оболочка делает это, и я не думаю, что какие-либо пользователи запрашивают это, но, возможно, они это делают. Просто кажется, что загадочная сложность Unix без особой выгоды для конечного пользователя. Когда конечного пользователя волнует, является ли каталог символической ссылкой или нет, функция символической ссылки не работает. Конечным пользователям должно быть все равно. В то время как я вижу более подходящие варианты использования для утилит рекурсивного обхода файлов, таких как tar и scp, имеющих опции для отказа от следования символическим ссылкам, для интерактивной оболочки, выполняющей cd, не очевидно, каково значение. Просто любопытно.   -  person Peter Lyons    schedule 30.06.2010
comment
Bash предоставляет cd -P и cd -L (по умолчанию cd -L). Когда вы выполнили cd -P, cd .. поднимает вас вверх по иерархии физической файловой системы, даже если вы перешли туда по символической ссылке, но если вы выполнили cd -L, чтобы попасть туда, то cd .. отсекает один элемент от имени файла символическая ссылка, чтобы поднять вас на уровень выше.   -  person Jonathan Leffler    schedule 11.02.2014


Ответы (2)


Может быть, я неправильно понимаю, но вы просто хотите (псевдокод):

is_symlink = method_from_other_question();
if(is_symlink and arg(-P))
    fail("Can't switch directory -- is a symlink");

Если вы уже пробовали что-то подобное, и оно не работает, включите код в свой вопрос, и мы поможем его отладить.

person Michael Mrozek    schedule 19.06.2010

Оболочки обычно делают много хитростей, чтобы найти настоящее имя каталога. И они также подделывают много вещей для удобства нашего пользователя. Например.:

$ pwd
/home/auser
$ ls -l
adir -> some/place/
some/
$ cd adir
$ pwd
/home/auser/adir
$ cd ..
$ pwd
/home/auser

Выглядит логично? Затем посмотрите еще раз: .. в /home/auser/some/place указывает на /home/auser/some, а не /home/auser, но cd .. привело вас к более позднему.

IOW, нет другого пути, кроме как всегда хранить в памяти абсолютный путь к текущему каталогу и полностью его анализировать (и проверять каждый его элемент) при выполнении cd.

И да, это не надежно. В прошлом однажды мне удалось обмануть bash, и он показывал совершенно неправильный абсолютный путь для моего текущего каталога.

person Dummy00001    schedule 20.06.2010