Чи "~ / Документи" відносний чи абсолютний шлях?


37

Це просто лише питання лексики, але яке в моїй голові постійно крутиться.

Він походить з іспиту на практику з книги підготовки LPIC . Правильна відповідь у книзі полягає в тому, що ~/Documentsце відносний каталог, оскільки він відносно домашнього каталогу.

Однак ця книга містить почесне співвідношення помилок друку і помилок, тому я не можу сприйняти як належне все, що там написано. Тут я не згоден, тому що для мене ~діє як змінна, розширена оболонкою, або на вміст $HOMEзмінної, або на поточний шлях до домашнього каталогу користувача (пор. man bash), Тому власне шлях /home/myuser/Documentsє справді абсолютним каталогом.

Навіть Вікіпедія мені, здається, нічим не допомагає з цієї теми (навіть якщо це, здається, підтверджує, що книга в цій неправильній):

Абсолютний або повний шлях вказує на те саме місце у файловій системі незалежно від поточного робочого каталогу. Для цього він повинен містити кореневий каталог.

Навпаки, відносний шлях починається від деякого даного робочого каталогу, уникаючи необхідності надання повного абсолютного шляху.

І тут я знову не погоджуюся: згідно з цим визначенням шлях, /opt/kde3/bin/../libякий не залежить від поточного робочого каталогу, повинен бути абсолютним, проте моє поточне розуміння цього питання відповідає автору книги, що робить цей шлях відносним.

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

абсолютний шлях - шлях відносно кореневого каталогу. Першим його символом повинен бути роздільник імені шляху.

Отже $HOME/Documents, чи навіть просто $HOMEне вважалися б абсолютними каталогами? Або це визначення передбачає змінне розширення? Що з ~характером оболонки ? Чи є якесь достовірне визначення відносного та абсолютного каталогу, яке я можу десь знайти, і я взагалі помиляюся?


7
Усі шляхи відносні, деякі з них відносно лише до кореневого каталогу /, а ті, які ми називаємо абсолютними. Таким чином , все , що починається від /я б назвав абсолютним (навіть якщо це /usr/../etc) , і все інше , я б назвав відносними ( ~/Doc, Doc, ../john/Doc, $HOME/..., ...). Справа в тому, що абсолют повинен працювати незалежно від поточного робочого каталогу чи поточного користувача. Відносні можуть працювати лише в деяких конкретних вузьких випадках.
jimmij

6
Шлях може розширюватися до іншого місця залежно від того, хто є користувачем. Сказавши це, на мою думку, це все-таки абсолютний шлях, а не відносний шлях. Хоча я не думаю, що визначення абсолютного та відносного шляху настільки точно визначені. Це не математика. Це питання насправді не перевіряє розуміння, imo, і безглуздо.
Faheem Mitha

1
@FaheemMitha: LPIC - це дистрибуція нейтральної дистрибуції Linux. Сама сертифікація здається прекрасною, але це далеко не те, що стосується (принаймні деяких) книг, що продаються для підготовки до цього іспиту як самостійного вивчення ...
WhiteWinterWolf

2
@jimmij: "родич" має конкретні технічні значення в контексті шляхів, і використання іншого англомовного сенсу цього слова є поганою практикою. Я повністю не погоджуюся з тим, щоб називати ~/fooвідносний шлях. Що ви отримуєте, це різниця між жорстким кодуванням та параметризацією. Дивіться мою відповідь для отримання більш детальної інформації.
Пітер Кордес

1
Визначення Вебстерського словника є правильним, але дуже заплутаним. Однак, це означає, що рядки, такі як ~/Documentsі $HOME/Documentsне є шляхами. Вони ідентифікують (абсолютний) шлях після розширення, але вони самі не є шляхами. Я думаю, що це узгоджується з тим, скільки користувачів Unix / Linux використовують цей термін, але без сумніву, ці рядки також називаються самими шляхами.
reinierpost

Відповіді:


41

Якщо автор намагався наздогнати вас, розмовляючи про цю буквальну рядок (без розширення оболонки) як про шлях, то це відносний шлях ( mkdir -p './~/Documents'). Інакше:


Це абсолютний шлях , оскільки його вирішення не залежить від поточного робочого каталогу процесу. Відносний шлях завжди означає відносно робочого каталогу процесу. Або у випадку цілей симлінк по відношенню до місця розташування симпосилання. ( gcc -> gcc-5.2проти gcc -> /usr/bin/gcc-5.2). Це має значення для монтування NFS та інших випадків, коли ви можете дістатися до одного і того ж символьного посилання різними абсолютними шляхами. напр

/net/tesla/home/peter/foo -> bar  # always works from other machines

/net/tesla/home/peter/foo -> /home/peter/bar  # references my home dir on the local machine, not tesla.

Debian іноді встановлюватиме посилання на ../../doc/whatever/whateverабсолютну ціль, а не на абсолютну ціль символічного посилання, тому він працює, коли NFS встановлений десь в іншому місці, або коли дивиться на chroot, не chroot(8)впадаючи в нього.

У кожного процесу Unix є свій cwd. pwdКоманда існує тільки для друку.

Дивіться: http://pubs.opengroup.org/onlinepubs/9699919799/functions/getcwd.html для отримання додаткових відомостей про зміну каталогів із системними дзвінками POSIX.


Як усі інші сказали, перед ~розширенням оболонки розгортається оболонка. Використання ~/bin/myprogсценарію оболонки змусить його працювати по-різному для різних користувачів. Різниця між ~/bin/fooі /home/peter/bin/fooполягає в тому, що один з них зашифрував місце розташування, а інший параметризував його. Помилка (IMO) називати ~версію відносною траєкторією.

Говорити про те, що речі "відносно змінної середовища" просто заплутані. Неправильно застосовувати різні англомовні значення термінів, які мають конкретні технічні значення в контексті, в якому ви їх використовуєте.

На зламаній системі, з HOME=a/relative/path, ~/fooрозшириться до відносного шляху. Це взагалі не було б корисним налаштуванням.


3
Дякую за цю відповідь, вона, здається, є найбільш повною для мене. У мене також таке враження, що автор помилково змішав поняття канонічного шляху до цього (якого автор ніде не згадує). /opt/kde3/bin/../libнаприклад , помилково класифікуються як відносний шлях: він є абсолютним шляхом , але НЕ канонічним. Як ви вже сказали, це просто робить все заплутаним, тому дякую за ваше роз’яснення та інформацію, пов’язану з NFS :)!
WhiteWinterWolf

1
Я повинен зробити висновок, що писати тестову підготовку не дуже цікаво, і що люди, які просто використовують Unix або GNU / Linux для своїх повсякденних обчислень, - це не ті, хто пише ці книги. Цей приклад викликає не-canononical шлях щодо здається , дуже погано і для мене очевидно. man7.org/linux/man-pages/man3/realpath.3.htmlrealpath(1)) зробіть і те, і інше: канонізуйте і зробіть абсолютне (а також слідуйте за посиланнями), тому, можливо, там виникла якась плутанина.
Пітер Кордес

2
Все-таки це просто звичайні повсякденні поняття для мене. Я думаю, що було б дивно мати папірець, який сказав, що я їх знаю ... Але удачі, коли ви отримаєте свій аркуш паперу, @WhiteWinterWolf, щоб показати всім людям, які люблять дивитися на папірці. :)
Пітер Кордес,

48

Це по суті питання про визначення термінів. Тож для ваших цілей відповідь - все, що хоче LPIC. Але ми можемо прийти до деяких висновків на основі технічних фактів:

Якщо ви перейшли '~/Documents'до системного виклику , він шукатиме каталог, названий саме ~в поточному каталозі (і, ймовірно, не працює). Отже, під поняттям імен шляхів, які використовує ядро , це відносний шлях - але це не те, що ми мали на увазі.

~це синтаксис, реалізований оболонкою (та іншими програмами, що імітують її для зручності), що розширює її в реальне ім'я шляху. Для ілюстрації - ~/Documentsце приблизно те саме, що і $HOME/Documents(знову ж, синтаксис оболонки). Оскільки $HOMEмає бути абсолютний шлях, значення $HOME/Documents також є абсолютним шляхом. Але текст $HOME/Documentsабо ~/Documentsмає бути розширений оболонкою, щоб стати маючи на увазі шлях.

Таким чином, якби я хотів бути точним і послідовним, я б сказав, що ~/Documentsце фрагмент оболонки-скрипту, який розширюється до абсолютного шляху.


Звичайно, ядро ​​не має поняття, що $HOMEозначає, як і не має поняття, що ~означає. Однак я вважаю, що ~ розширення робиться оболонкою як сумнівне; більшість програм підтримує це, що вказує на бібліотеку С, а не на оболонку. Однак розширення змінної середовища є особливістю оболонки; ви можете відкрити ~/somefile.odtв LibreOffice, але ні $HOME/somefile.odt, навіть якщо LibreOffice був запущений із оболонки, в якій належним чином встановлено $ HOME.
CVn

5
Ви можете вважати це сумнівно всім, що вам потрібно, але це документально підтверджено і його слід легко підтвердити чи спростувати в C.
Марно

6
Інші програми реалізують ~синтаксис в імітації оболонки, оскільки це корисний ярлик. Я насправді не знаю, чи існує функція бібліотеки, яка виконує розширення, але це, безумовно, щось, що робиться окремо від фактично використання імені шляху.
Кевін Рейд

2
globі wordexpвиконувати розширення серед іншого.
o11c

2
@ MichaelKjörling: Кілька програм реалізують ~розширення; більшість ні. Наприклад, якщо ви вводите ls -l ~, lsпрограма ніколи не бачить ~символу; вона розгорнута оболонкою, перш ніж lsвикликати. Якщо ви насправді перейдете ~до ls, це не стосується спеціально; спробувати ls -l '~'' (який спробує перелічити файл, названий буквально ~).
Кіт Томпсон

16

Якщо $HOMEє /home/white/, ~/Documents( так само , як $HOME/Documents) розширюється оболонки (див тут для пояснення) до /home/white/Documents, який є абсолютним шляхом.

Відносний шлях - це той, який не починається з /(після розширення оболонки), як ../Documentsабоfoo/bar

Деякі старі снаряди Не розширюються ~(шлях bash, tcsh, zshі т.д. ... робить); вони бачили ~/Documentsб відносний шлях, починаючи з ~; але у вас зазвичай немає назви каталогів ~(але ви можете створити таке, за допомогою mkdir '~'якого я не рекомендую).


Ви повинні згадати, які снаряди не розширюються~
Едвард Торвальдс

3

An абсолютний шлях починається з /(що відноситься до фіксоване), а відносний шлях починається з поточного каталогу (і так , що вона відноситься до змін як поточних змін каталогу). Більшість оболонок використовують ~на початку як абревіатуру для абсолютного шляху до домашнього каталогу поточного користувача, тобто ~/Documentsце каталог Documentsу будинку поточного користувача, незалежно від того, яким може бути поточний каталог. Тож це абсолютний шлях.


1

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


Визначення набагато більше, ніж думка. Вікіпедія забиває це для загальної справи, а не лише для Unix: en.wikipedia.org/wiki/…
Пітер Кордес,

1

Використання ~ / на початку робить шлях абсолютним, оскільки (за будь-яким визначенням) можливість знаходити документи не залежить від того, де ви зараз перебуваєте. Однак розширення здійснюється оболонкою, а не ядром, тому якщо ви використовуєте оболонку, яка не розпізнає цей синтаксис (наприклад, / bin / sh, оригінальна оболонка Bourne, а не псевдонім bash), ви будете поза удача.

Цікаво, що якщо ви використовуєте ~ root / а не ~ /, оптимізація читання $ HOME, як правило, не застосовується, і завжди буде дозволена до абсолютного, якщо / etc / passwd правильний.


-1

Здається, книга вважає, що абсолютний шлях - це будь-який шлях, що починається з а /, а відносний шлях - це все інше.

Ви можете переглянути .. і $HOMEподібні типи жетонів. Обидва повинні бути замінені для компонента шляху, перш ніж шлях вирішиться до абсолютного шляху.


3
Як ..щось подібне $HOME? ..може бути на початку шляху, переданого безпосередньо до системного виклику, розширення оболонки не потрібно. Такий шлях не є абсолютним шляхом; це все ще відносно місця розташування cwd або symlink. Якщо автор не намагався вас наздогнати, розмовляючи про цю буквальну рядок (без розширення оболонки) як про шлях. Я думаю, що ти намагаєшся виправдовуватися за книгу, але я більше схильний сказати, що це неправильно, і не дозволяти, щоб речі заплуталися.
Пітер Кордес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.