У якому каталозі представлений шлях `//` в Linux?


13

Коли я хочу повернутися до каталогу верхнього рівня в Linux, набравши текст cd .., я надрукував текст cd //. На превеликий подив, про помилки не повідомляється. Тим більше що підкаже username@hostname://$. lsвказує на те, що я зараз в кореневій директорії.

Це помилка чи особливість оболонки? Якщо функція є //псевдонімом /? Моя оболонка - GNU bash, версія 4.1.5 (1) -release (i686-linux-gnu).

Дякую і всього найкращого.


Відповіді:


30

Це можна вважати будь-яким.

У Linux //нічого не означає - кілька послідовних косої риски згортаються до однієї, в будь-якій точці шляху, включаючи початок. Зміна каталогу для того, щоб //вас вводити /, як readlink /proc/self/cwdби показало біг ; аналогічно, /usr//local///binзгортається на /usr/local/bin.

Однак деякі інші системи, схожі на Unix, наприклад Cygwin або старий домен / ОС Apollo, використовують // префікс для мережевих шляхів, таких як //fileserver/path/to/data. POSIX також дозволяє це.

З різних причин оболонка bash самостійно відстежує поточний каталог (окрім відстеження, передбаченого ОС), і в ньому є код, який запобігає //згортанню початкового , щоб залишатися сумісним з такими системами. "Особливістю" є те, що bash забезпечує більш інтуїтивне відстеження поточного каталогу, наприклад, коли ви cdпереходите на символьне посилання, bash покаже вам очікуваний шлях, навіть якщо ядро ​​думає інакше. "Помилка" полягає в тому, що bash дозволяє //навіть у системах, які не використовують його.


Цікаво, що zshдозволяє cd //, але досить розумний, щоб просто показати /у рядку підказок.
new123456

@BinaryZebra Bitsavers має колекцію старих посібників Unix, включаючи Apollo - там має бути багато прикладів. На веб-сайті TUHS також має бути щось.
користувач1686

Велике спасибі, я знайшов опис // у посібнику щодо Bitsavers.

9

З визначення шляху POSIX:

Ім'я контуру може необов'язково містити одну або більше косої косої риски. Кілька послідовних косої риси вважаються такими ж, як одна коса коса.

Джерело

І точніше, як жаркість, про яку йдеться у його коментарі нижче, з розділу 4.11 про роздільну здатність Pathname:

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


1
Більш правильний розділ - роздільна здатність Pathname 4.11 (останній абзац), оскільки поведінка, про яку йдеться, з'являється лише для двох провідних косих косої риски.
користувач1686

3

Це своєрідна особливість. Якщо у вас є і використовується сценарій оболонки find, наприклад, усі контури мають префікс ./. Як правило. Потім, якщо ви встановите цей фактичний шлях, він стає `/my/path/./appended/path, який вирішує значення / my / path / додається / path. Отже, якщо я не помиляюся, // трактують як /./ і, отже, /. Це те саме, що якби ви перейшли до / home / user //, ви завершили б / home / user /


1

Я б пішов на оперативне відображення "помилки".

Будь-які шляхи "/", "//", "//////////////////////", ... мають однакове значення: "/". Ви можете додати скільки завгодно "/" куди завгодно на шляху до Unix, це не змінить його значення.

Тут "помилка" більшою мірою пов'язана з тим, що ваш запит використовує останній допустимий текст, введений у шлях для відображення, а не власне "pwd".

Смішно все одно;)


Погоджено - //в підказці є побічним ефектом змінної середовища провідного ( $PS1) - як це PS1визначено?
Дуг Харріс

@DougHarris $PS1змінна визначається як [\u@\h \W]\$. Якась проблема з налаштуванням?
Summer_More_More_Tea

Незвичайно. Якщо я спробую цей PS1, я отримую лише один, /коли pwd = /. Мені було цікаво, чи робите ви додаткову роботу, щоб отримати каталог. Є чи $PROMPT_COMMANDвстановити?
Дуг Харріс

@DougHarris Так, ця змінна встановлюється, значення якої echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#HOME/~}"; echo -ne "\007". Не могли б ви пояснити трохи детальніше? Я не зовсім знайомий з цими двома змінними. Спасибі.
Summer_More_More_Tea

Читайте сторінку bash man і шукайте PS1та PROMPT_COMMAND- використовуйте man bashу своєму командному рядку чи читайте в Інтернеті
Doug Harris

1

Її особливість і всі множинні // будуть замінені на один /

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

MY_WORKSPACE = / home / your_username / робоча область /
MY_NEW_PROJECT = $ MY_WORKSPACE / my_proj /
cd $ MY_NEW_PROJECT 

повний зміст змінної проекту є

/ home / your_username / робоча область // my_proj /

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.