Для меня запуск скрипта с:
bash./< script file >
работает нормально.
Команды 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
является такой дефектной оболочкой.
Важно прочитать статью http://doc.cat-v.org/plan_9/4th_edition/papers/lexnames, где Роб Пайк говорит об этом вопросе.
Вам также необходимо указать свою оболочку, например, bash отслеживает представление о текущем каталоге, и если вы скажете cd..
, он просто отрезает последний компонент и вносит изменения в него, а не выполняет системный вызов chdir("..")
.
Извините, сейчас на телефоне, отредактирую позже...
Вы можете дать -p попытку, которая будет следовать физической структуре каталогов без перехода по символическим ссылкам