2010-06-19 1 views
1

Я пишу свою собственную программу оболочки. В настоящее время я выполняю команду cd с помощью chdir. Я хочу реализовать Chdir с ниже вариантов:реализация команды cd с использованием chdir() в linux

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

Я отправил question here previously asking to know if a path is a symbolic link or actual path. Но с этой информацией я не могу получить никаких идей о том, как продолжить описанную выше проблему.

Благодаря

+2

У вас есть хороший прецедент для этой функции? Я не думаю, что какая-либо существующая оболочка делает это, и я не думаю, что любые пользователи запрашивают это, но, возможно, это так. Просто похоже на сложную сложность unix без особых преимуществ для конечных пользователей. Когда конечный пользователь заботится о том, является ли каталог символической ссылкой или не является символической ссылкой, функция «Символ» не работает. Конечным пользователям все равно. Хотя я вижу более допустимые варианты использования для рекурсивных утилит обхода файлов, таких как tar и scp, имеющих параметры вокруг не следующих символических ссылок, для интерактивной оболочки, выполняющей cd, неясно, что это за значение. Просто любопытно. –

+0

Bash предоставляет 'cd -P' и' cd -L' (и по умолчанию 'cd -L'). Когда вы делаете 'cd -P',' cd ..', вы поднимаете иерархию физической файловой системы, даже если вы следовали символической ссылке, чтобы получить вас там, но если вы сделали 'cd -L', чтобы получить вы там, затем 'cd ..' отбивает один элемент с именем символической ссылки, чтобы вы« подняли »уровень. –

ответ

0

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

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

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

0

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

$ 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, и он показывал абсолютно неправильный абсолютный путь для моего текущего каталога.