cd .. у кореневій папці


44

Чому cd .., введений у кореневій папці, не попереджає або не працює з помилкою?

Я б очікував:

/$ cd ..
-bash: cd: ..: No such file or directory

Натомість я лишаюсь на /. Звичайно, це є, оскільки ..існує в /, і просто /, просто так .. Мені просто цікаво, чому це так.


6
Немає відповіді, але ось хороше асоційоване читання, Роб Пайк на G +, обговорюючи походження dotfile (s).
bsd

Відповіді:


53

Відповідно до Open Group (відповідає за стандарт POSIX):

Кожен каталог має рівно один батьківський каталог, який представлений іменем dot-dot у першому каталозі. [...] Те, що стосується імені файлу dot-dot стосовно кореневого каталогу, визначається реалізацією. У версії 7 він посилається на сам кореневий каталог; така поведінка згадується в POSIX.1-2008. У деяких мережевих системах конструкція /../hostname/ використовується для посилання на кореневий каталог іншого хоста, і POSIX.1 дозволяє цю поведінку.

(Джерело)


29

Ви не отримуєте помилки, оскільки навіть у /каталозі насправді є вірний запис для каталогу .., але на відміну від інших каталогів він вказує на сам каталог і, таким чином, веде себе ідентично .:

$ ls -lid / /. /..
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /.
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /..
$

Оскільки перший стовпець говорить вам, ., ..і /всі вони мають один і той же індексний дескриптор-номер і , таким чином , одні й ті ж елементи файлової системи.

Тож навіть якщо ви cd ..всередині /себе просто залишаєтесь /.


13
Питання задає питання, чому саме ..запис в каталозі.
Нік Маттео

3
Єдина причина, яка мені спадає на думку, - це те, що ви хочете ставитися так /само, як і до будь-якої іншої папки, включаючи дійсну запис для ... В іншому випадку вам доведеться по- /різному ставитися до всіх інших папок у системі.
Dohn Joe

15

Це є тому, що для його видалення знадобиться створити спеціальний код обробки в ядрі та бібліотеках С. Зараз ви можете припустити, що завжди буде "." та ".." у будь-якому каталозі, в який ви переходите.

Єдиний необхідний код спеціального випадку - це код монтажу файлової системи, де код замінює значення inode '..', щоб вказати на каталог, що містить точку монтування, оскільки кореневі каталоги не завжди є кореневими каталогами.


Зрештою, неможливо, щоб "батьківське направлення" в структурах дерев було позбавлене будь-якого оброблення спеціального випадку, чи не так? Корінь повинен бути спеціальним за визначенням, і будь-яка спроба замаскування призведе до особливих випадків або плутанини в іншому місці.
musiphil

@musiphil У unix спеціальні випадки тут переміщуються в mountкоманду та пов'язаний з нею спеціальний файл /etc/fstab.
luser droog

1

Інший спосіб перевірити , що .і ..в /самому справі:

$ readlink -f ..
/home

$ readlink -f /.
/

$ readlink -f /..
/

Як бачите, .і на ..це вказується /.


1

Ще одна причина ".." полягає в / полягає в тому, що якби її не було, це створило б ще один особливий випадок: кореневий каталог матиме одне тверде посилання менше, ніж усі інші каталоги (усі вузли каталогів мають n + 2 посилань, де n є кількість прямих підкаталогів всередині). Це дозволить зламати різні програми, на які покладається оптимізація сканування каталогів.


0

Приємно, що він є, тому що в іншому випадку я не зміг би спам ../../../../потрапити до кореня з папки. Якби це не дозволило ..в корені, то я застряг би підрахувавши кількість папок внизу робочого режиму.


10
Що не так cd /?
Бах

@Bach Іноді розтирання клавіатури - це веселіше. Крім того, за багатьох обставин ви не намагаєтесь перейти до кореня, і в цьому випадку ../краще використовувати. Я також роблю багато файлових операцій в PHP, де я не можу зробити це /з кількох причин.
Skylar Ittner

2
Зворотний бік полягає в тому, що, можливо, ви випадково ввели занадто багато ../s і працювали над (або видаляєте) файл, який ви не мали наміру без помилок.
jamesdlin

4
Повторення ../більше разів, ніж потрібно, і бажаючи, щоб вона працювала за призначенням, виглядає для мене (спокою) логічною помилкою, навіть якщо файлова система, очевидно, дозволяє це.
musiphil

@musiphil введення пробілів між командами - це логічна помилка (припущення, що всі проміжки між хвостом -f | grep є обов'язковим). Більшість людей з Unix страждають від цього. Введення "../ .." виглядає як проблема Windows-фолк (за замовчуванням cmd починається в X: \ Windows, і вам доведеться спамувати з самого початку). Навіщо лікувати невелику проблему, коли є більша? (пробіли)
kagali-san
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.