Как .. (точка) разрешается в bash, когда cwd является символической ссылкой на каталог

Для меня запуск скрипта с:

bash./< script file > 

работает нормально.

4
02.08.2018, 01:07
3 ответа

Команды cdи pwdимеют два режима работы.

  • -L логический режим :символические ссылки не разрешены

  • -Физический режим P :символические ссылки разрешаются перед выполнением операции

Здесь важно знать, что cd..не вызывает системный вызов chdir(".."), а скорее сокращает $PWDпеременную оболочки, а затем chdirs на этот абсолютный путь.

Если вы находитесь в физическом режиме, это идентично вызову chdir(".."), но в логическом режиме это отличается.

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

Если вы вызываете cd -Pвместо просто cd, то после операции chdir()возвращаемое значение из getcwd()помещается в переменную оболочки $PWD, а следующее cd..приведет вас к каталог, который физически находится выше текущего каталога.

Так почему же POSIX по умолчанию менее безопасен?

Если вы перешли символическую ссылку в режиме POSIX по умолчанию и сделали следующее:

ls../*.c
cd..
rm *.c

вы, вероятно, удалите файлы, отличные от тех, которые были перечислены командой lsранее.

Если вам нравится более безопасный физический режим, установите следующие псевдонимы:

alias cd='cd -P'
alias pwd='pwd -P'

Поскольку при использовании более одного параметра из -Lи -Pпоследний вариант имеет преимущество, вы все равно можете получить другое поведение.

Историческая справка:

Bourne Shell и ksh88 получили код отслеживания каталогов одновременно.

Оболочка Bourne Shell действительно получила более безопасное физическое поведение, в то время как ksh88 в то же время получил менее безопасный логический режим по умолчанию и параметры -Lи -P. Возможно, ksh88 использовал поведение csh в качестве эталона.

POSIX принял поведение ksh88, не обсуждая, является ли это хорошим решением.

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

4
27.01.2020, 20:54

Важно прочитать статью http://doc.cat-v.org/plan_9/4th_edition/papers/lexnames, где Роб Пайк говорит об этом вопросе.

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

Извините, сейчас на телефоне, отредактирую позже...

4
27.01.2020, 20:54

Вы можете дать -p попытку, которая будет следовать физической структуре каталогов без перехода по символическим ссылкам

http://linuxcommand.org/lc3_man_pages/cdh.html

1
27.01.2020, 20:54

Теги

Похожие вопросы