2

Я использую Linux в течение последних 15 лет, и сегодня я столкнулся с чем-то, что меня удивило.

Настройте следующую структуру каталогов:

$ cd /tmp
$ mkdir /tmp/symlinktest
$ mkdir /tmp/symlinktest/dir
$ mkdir /tmp/symlinktarget

Теперь создайте две ссылки sym в symlinktest, указывающие на symlinktarget:

$ cd /tmp/symlinktest
$ ln -s ../symlinktarget Asym
$ ln -s ../symlinktarget Bsym

Теперь в bash следующее завершение вкладки делает странные вещи. Введите следующее:

$ cd dir
$ cd ../A[TAB]

Нажатие клавиши табуляции выше завершает строку для:

$ cd ../Asym/

как я и предполагал. Теперь нажмите Enter, чтобы перейти в Asym и введите:

$ cd ../B[TAB]

На этот раз нажатие клавиши табуляции завершает ссылку на:

$ cd ../Bsym[space]

Обратите внимание, что после Bsym теперь есть пробел и нет косой черты.

Мой вопрос: почему при переходе от физического каталога "dir" к Asym он распознает, что Asym является ссылкой на каталог, но при переходе от одной ссылки sym к другой он не распознает, что это ссылка на каталог?

Кроме того, если я пытаюсь создать новый файл в Asym, я получаю сообщение об ошибке:

$ cd /tmp/symlinktest/Asym
$ cat hello > ../Bsym/file.txt
-bash: ../Bsym/file.txt: No such file or directory

Я всегда думал, что символические ссылки в основном прозрачны, за исключением программ, которые должны ими манипулировать. Это нормальное поведение?

Большое спасибо,

Энди

1 ответ1

2

Встроенный cd bash делает немного магии с ..

Когда вы делаете:

cd ../Bsym

Он смотрит на $PWD , удаляет последний компонент, добавляет компонент Bsym. Это то, что делают cd и cd -L , в отличие от cd -P . Также смотрите pwd -L и pwd -P .

Когда вы делаете:

cat hello > ../Bsym/file.txt

Эта магия не имеет места. $PWD не используется, вместо него используется /proc/self/cwd . Cwd - это инод, а .. это просто родительский инод, который /tmp .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .