Правила синтаксису шляху


10

Я пишу бібліотеку для маніпулювання рядками шляху Unix. У цьому випадку мені потрібно зрозуміти кілька незрозумілих куточків синтаксису, про які більшість людей не турбуватиметься.

Наприклад, якнайкраще я можу сказати, здається, що foo/barі те, і foo//barінше вказують на одне місце.

Крім того, ~зазвичай стоїть на домашньому каталозі користувача, але що робити, якщо він з’являється посеред шляху? Що ж відбувається тоді?

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

(На жаль, пошук таких термінів, як "синтаксис контуру Unix" просто налічує мільйон сторінок, де обговорюється $PATHзмінна ... Чорт, я навіть намагаюся знайти відповідні теги для цього питання!)


ok ~ tilde і -name іменне розширення є основними визначеними POSIX особливостями будь-якого середовища Unix. Кілька порад: ім'я файлу може бути будь-яким, крім \ 0 або /. ////// та / - те саме. $ PWD обробляється в ядрі і може бути прочитаний для будь-якого (Linux) процесу в / proc. /./ може зустрічатися лише в корені шляху. У $ PATH ::::: і: - те саме. / dev / null / dev / tty та / tmp - це гарантовані POSIX шляхи для кожної відповідної системи.
mikeserv

1
Більшість ваших запитань (але не частина про них ~) висвітлено у розділі Як linux обробляє декілька розділювачів шляхів (/ home //// username /// file) . Найближчим до нормативного посилання буде специфікація POSIX або Single Unix - непросте зчитування.
Жил "ТАК - перестань бути злим"

Відповіді:


13

Існує три типи шляхів:

  • відносні шляхи подобається foo, foo/bar, ../a, .. Вони не починаються /і відносяться до поточного каталогу процесу, що робить системний виклик цим шляхом.
  • абсолютні шляхи, як /, /foo/barабо ///x. Вони починаються з 1 або 3 або більше /, вони не відносні, їх шукають, починаючи з /кореневого каталогу.
  • POSIX дозволяє //fooспеціально лікуватися, але не визначає, як. Деякі системи використовують це в особливих випадках, таких як мережеві файли . Це повинно бути рівно 2 куски.

Окрім того, як на початку, послідовності косої риси діють як одна.

~це лише особлива оболонка , вона розширена оболонкою, вона зовсім не особлива для системи. Як це розширюється, залежить оболонка. Оболонки роблять інші форми розширень, такі як globbing ( *.txt) або змінне розширення /$foo/$barабо інші. Що стосується системи, ~fooце лише відносний шлях на зразок _fooабо foo.

Що потрібно пам’ятати:

  • foo/не те саме, що foo. Це ближче до foo/.ніж foo(особливо , якщо fooце символічний) для більшості системних викликів на більшості систем ( foo//так само , як foo/якщо б).
  • a/b/../cнеобов'язково те саме, що a/c(наприклад, якщо a/bце симпосилання). Найкраще не лікувати ..спеціально.
  • взагалі безпечно вважати a/././././bте саме, що як a/bби.

Отже, підсумовуючи, якщо мене не хвилює маніпулювання траєкторією оболонки (яка є величезною і складною), мені потрібно лише подбати про те /, .і ..(?)
MathematicalOrchid

Приклад //fooобробки - у Cygwin, де він використовується для контурів UNC . Тобто це //server/share/dir/file.txtзаконний шлях, який за замовчуванням вказує на позасистему Cygwin справді переглядає локальну систему, якщо її не може знайти server.
Воррен Янг

3

Наприклад, якнайкраще я можу сказати, здається, що foo / bar і foo // bar обидва вказують на одне місце.

Так. Це часто, тому що програмне забезпечення іноді поєднує шлях, припускаючи, що перша частина не була закінчена прямою косою рисою, тому її потрібно кинути, щоб переконатися (тобто може виявитися два чи більше). foo///barа foo/////barтакож вказують на те саме місце, що і foo/bar. Приємною функцією для бібліотеки маніпулювання контуром буде та, яка зменшує будь-яку кількість послідовних косої риски до однієї (за винятком на початку шляху, де вона може бути використана URL-ish способом, або, як вказує Стефан, для будь-якого невизначене спеціальне призначення).

Також ~ зазвичай означає домашній каталог користувача

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

Крім того, ~це юридичний характер у * nix шляху і його не слід змінювати ні на що інше. Відповідно до цього , єдиними символами, які не є юридичними в імені файлу unix, є /(тому що це роздільник шляху) та "null" (ака. Нульовий байт), оскільки вони взагалі незаконні в тексті.


+1 для пояснення розширення тильди; Я не мав уявлення, що ти можеш звертатися до інших користувачів!
Математична

2
Як каже Стефан, ви не можете сліпо згортати всі повторні косої частини. Кілька перерізів вперед на початку шляху повинні бути обережні.
Воррен Янг

@WarrenYoung Відредаговано, щоб зробити це зрозумілим. PS. Вперед ??! O_O
goldilocks

Краще, хоча я б не сказав, що це не має нічого спільного з URL-адресами. UNC сходить до кінця 1980-х, тоді як URL-адреси з'явилися лише через роки.
Варрен Янг

@WarrenYoung Справедливо, хоча, здавалося б, UNC характерні лише для платформ MS , //технічно це теж не так. І URL-адреси, і новіші, згідно з SC, вільно неоднозначні специфікації POSIX для, // можливо , були отримані з таких, і в цьому випадку "URL-ish" здається влучною міткою для конвенції (навіть якщо UNC старіші, і навіть якщо схожість ненавмисне). Я б ніколи не сказав, що "вони є URL-адресами", тільки це //або \\ служить "URL-ish" цілі.
goldilocks
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.