Можливо, щоб процес допиту файлової системи визначив її поточну робочу директорію, використовуючи метод, який є занадто складним, щоб бути темою як відповідь на це питання. Це те, що виконують 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.