Можливо, щоб процес допиту файлової системи визначив її поточну робочу директорію, використовуючи метод, який є занадто складним, щоб бути темою як відповідь на це питання. Це те, що виконують pwd
програма та getcwd
функція бібліотеки. У перші дні Unix вони були єдиними способами дізнатися, що таке ваш робочий каталог. Ось частина відповіді на ваше запитання, яку я не можу знайти ні в одній з інших відповідей, ні навіть у будь-якому іншому місці на цьому веб-сайті (після 42 секунд, який варто шукати):
- Коли оболонка запускається, вона отримує свій поточний робочий каталог (можливо, зателефонувавши
getcwd
).
Після цього, коли ви робите a cd
, pushd
або popd
, оболонка відслідковує робочий каталог за допомогою функцій маніпулювання рядками. Наприклад,
- Якщо ваш робочий каталог є
/home/sim
і ви вводите cd ..
, оболонка обчислює, що це ваш робочий каталог /home
.
- Якщо ваш робочий каталог є
/home/sim
і ви вводите cd .
, оболонка обчислює, що ваш робочий каталог все ще є /home/sim
.
- Якщо ваш робочий каталог є
/home/sim
і ви вводите cd aa
, оболонка обчислює, що це ваш робочий каталог /home/sim/aa
- не перевіряючи, чи aa
є символічним посиланням.
Це робиться для економії "вартості" дзвінків getcwd
. Але це компроміс, оскільки це може призвести до невірної інформації.
- Команда
pwd
(вбудована) просто відображає запам'ятоване / обчислене поняття оболонки, що таке робочий каталог.
- Також оболонка вкладає своє запам'ятоване / обчислене поняття про те, що працює робоча директорія в змінну середовища PWD, для зручності користувацьких процесів. Процес ніколи не повинен покладатися на це, якщо він хоче точної інформації.
Отже, суть полягає в тому, що оболонка може заплутатися в тому, де вона знаходиться. Але якщо ви введете /bin/pwd
, це запускається в окремому процесі, який не має доступу до поняття оболонки про те, що таке робочий каталог, і таким чином він визначає справжній робочий каталог сам, старомодним способом. (Виняток: /bin/pwd
програма може переглядати змінну середовища PWD, і, мабуть, це відбувається, коли ви вказуєте -L
.) Ось ще один приклад того, як оболонка може заплутатися:
cd /home/sim/aa #
Припустимо, що /home
, /home/sim
і /home/sim/aa
#
всі це справжні каталоги (не символічні посилання).
pwd #
Вихід:, /home/sim/aa
що правильно.
mv ../aa ../bb
pwd #
Вихід:, /home/sim/aa
що невірно.
/bin/pwd #
Вихід:, /home/sim/bb
що правильно.
І, на випадок, якщо вам це не зрозуміло, якщо ви вводите ln -s . aa
і cd aa
, то ваш поточний робочий каталог не змінився , більше, ніж це робиться під час введення тексту cd .
- адже це, по суті, те, що ви робите під час введення cd aa
.