Thư mục nào đường dẫn `//` đại diện trong Linux?


13

Khi tôi muốn quay lại thư mục cấp cao hơn trong Linux bằng cách gõ cd .., tôi đánh máy cd //. Tôi rất ngạc nhiên, không có lỗi nào được báo cáo. Những gì nhiều hơn nhắc nhở trở thành username@hostname://$. lschỉ ra rằng tôi đang ở thư mục gốc.

Đây có phải là một lỗi hoặc một tính năng của vỏ? Nếu một tính năng, là //một bí danh /? Shell của tôi là GNU bash, phiên bản 4.1.5 (1) -release (i686-linux-gnu).

Trân trọng cảm ơn.


Câu trả lời:


30

Nó có thể được xem xét một trong hai.

Trong Linux, //có nghĩa là không có gì - nhiều dấu gạch chéo liên tiếp được thu gọn thành một, bất cứ nơi nào trên đường dẫn, kể cả bắt đầu. Thay đổi thư mục để //đặt bạn vào /, như đang chạy readlink /proc/self/cwdsẽ cho biết; tương tự như vậy, /usr//local///binđược sụp đổ để /usr/local/bin.

Tuy nhiên, một số hệ thống tương tự Unix khác, ví dụ Cygwin hoặc Apollo Domain / OS cũ, sử dụng // tiền tố cho các đường dẫn mạng như //fileserver/path/to/data. POSIX cũng cho phép điều này.

Vì nhiều lý do, bash shell tự theo dõi thư mục hiện tại (ngoài theo dõi do hệ điều hành cung cấp) và nó có mã trong đó ngăn chặn sự //sụp đổ ban đầu , để vẫn tương thích với các hệ thống như vậy. "Tính năng" là bash cung cấp khả năng theo dõi trực quan hơn của thư mục hiện tại, ví dụ, khi cdvào một liên kết tượng trưng, bash sẽ hiển thị cho bạn đường dẫn bạn mong đợi, mặc dù kernel nghĩ khác. "Lỗi" là bash cho phép //ngay cả trên các hệ thống không sử dụng nó.


Thật thú vị, zshcho phép cd //, nhưng đủ thông minh để chỉ hiển thị /trong chuỗi dấu nhắc.
new123456

@BinaryZebra Bitsavers có một bộ hướng dẫn sử dụng Unix cũ, bao gồm cả Apollo - nên có rất nhiều ví dụ ở đó. Trang web TUHS nên có một cái gì đó là tốt.
dùng1686

Rất cám ơn, tôi đã tìm thấy mô tả cho // trong hướng dẫn Bitsavers.

9

Từ định nghĩa tên đường dẫn POSIX:

Một tên đường dẫn có thể tùy ý chứa một hoặc nhiều dấu gạch chéo. Nhiều dấu gạch chéo liên tiếp được coi là giống như một dấu gạch chéo.

Nguồn

Và chính xác hơn là sự phô trương được đề cập trong bình luận của ông dưới đây, từ chương 4.11 về Nghị quyết tên đường dẫn:

Một tên đường dẫn bắt đầu bằng hai dấu gạch chéo liên tiếp có thể được diễn giải theo cách được xác định theo cách thực hiện, mặc dù nhiều hơn hai dấu gạch chéo hàng đầu sẽ được coi là một dấu gạch chéo.


1
Một phần thích hợp hơn là 4.11 Độ phân giải tên đường dẫn (đoạn cuối), vì hành vi trong câu hỏi chỉ xuất hiện cho hai dấu gạch chéo hàng đầu .
dùng1686

3

Đó là một loại tính năng. Nếu bạn đã sử dụng shell script và sử dụng find, ví dụ: tất cả các đường dẫn đều có tiền tố ./ thường. Sau đó, nếu bạn xử lý nó trên một đường dẫn thực tế, nó sẽ trở thành `/my/path/./appends/path, nó sẽ phân giải thành / my / path / appends / path. Vì vậy, nếu tôi không nhầm, // được hiểu là /./ và do đó /. Điều này cũng tương tự nếu bạn đã đến / home / user //, bạn sẽ kết thúc ở / home / user /


1

Tôi sẽ nhanh chóng hiển thị "lỗi".

Cả hai đường dẫn "/", "//", "///////////////////////", ... đều có cùng một nghĩa: "/". Bạn có thể thêm bao nhiêu "/" bất cứ nơi nào bạn muốn trong đường dẫn Unix, điều này không thay đổi ý nghĩa của nó.

"Lỗi" ở đây liên quan nhiều hơn đến thực tế là lời nhắc của bạn sử dụng đường dẫn được nhập hợp lệ cuối cùng để hiển thị, chứ không phải là "pwd" thực tế.

Dù sao cũng buồn cười;)


Đồng ý - //trong dấu nhắc là tác dụng phụ của biến môi trường nhắc ( $PS1) - được PS1định nghĩa như thế nào ?
Doug Harris

@DougHarris $PS1biến được định nghĩa là [\u@\h \W]\$. Bất kỳ vấn đề với thiết lập?
Summer_More_More_Tea

Lạ Nếu tôi thử PS1 đó, tôi chỉ nhận được một /khi pwd = /. Tôi tự hỏi nếu bạn đang làm bất kỳ công việc thêm để có được thư mục. Được $PROMPT_COMMANDđặt?
Doug Harris

@DougHarris Có, biến này được đặt, có giá trị là echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#HOME/~}"; echo -ne "\007". Bạn có thể vui lòng giải thích một chút chi tiết? Tôi không hoàn toàn quen thuộc với hai biến này. Cảm ơn.
Summer_More_More_Tea

Đọc trang bash man và tìm kiếm PS1PROMPT_COMMAND- sử dụng man bashtại dòng lệnh của bạn hoặc đọc trực tuyến
Doug Harris

1

Đây là một Tính năng và tất cả nhiều // sẽ được thay thế thành một

Nó hữu ích nếu bạn có các biến có đường dẫn như ví dụ ở cuối. Vì vậy, cd của bạn sẽ không gặp bất kỳ lỗi nào và bạn không phải thay đổi biến không gian làm việc.

MY_WORKSPACE = / home / your_username / workspace /
MY_NEW_PRO DỰ ÁN = $ MY_WORKSPACE / my_proj /
cd $ MY_NEW_PRO DỰ ÁN 

nội dung đầy đủ của biến dự án là

/ home / your_username / workspace // my_proj /

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.