Câu hỏi Đường dẫn nào `//` đại diện cho Linux?


Khi tôi muốn quay lại thư mục cấp cao hơn trong Linux bằng cách nhập cd .., Tôi đánh máy cd //. Trước sự ngạc nhiên lớn của tôi, không có lỗi nào được báo cáo. Lời nhắc sẽ trở thành gì username@hostname://$. ls cho biết tôi hiện đang ở thư mục gốc.

Đây có phải là lỗi hoặc tính năng của trình bao không? Nếu một đối tượng địa lý, là // bí danh của /? Vỏ 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.


13
2018-02-13 13:43


gốc


Xem superuser.com/q/314102/91047 - Stéphane Gimenez


Các câu trả lời:


Nó có thể được coi là một trong hai.

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

Tuy nhiên, một số hệ thống giống Unix khác, ví dụ Cygwin hoặc Apollo Domain / OS cũ, sử dụng //  tiếp đầu ngữ 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 theo dõi thư mục hiện tại của chính nó (ngoài việc theo dõi hệ điều hành được cung cấp) và nó có mã trong đó ngăn chặn ban đầu // bị sụp đổ, 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 theo dõi trực quan hơn về thư mục hiện tại, ví dụ, khi cd'vào một liên kết tượng trưng, bash sẽ chỉ cho bạn đường dẫn bạn mong đợi, mặc dù hạt nhân nghĩ khác đi. "Lỗi" là bash giấy phép // ngay cả trên các hệ thống không sử dụng nó.


30
2018-02-13 13:55



Thật thú vị, zsh cho phép cd //, nhưng đủ thông minh để chỉ hiển thị / trong chuỗi lời nhắc. - new123456
@BinaryZebra Bitsavers có một bộ sưu tập các sách hướng dẫn cũ của Unix, bao gồm cả Apollo - có rất nhiều ví dụ ở đó. Trang web TUHS cũng nên có thứ gì đó. - grawity
Rất cám ơn, tôi đã tìm thấy mô tả cho // trong hướng dẫn Bitsavers.


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à grawity được đề cập trong bình luận của mình dưới đây, từ 4.11 chương về Độ phân giải 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 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 đơn.


9
2018-02-13 14:18



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


Đó là một loại tính năng. Nếu bạn có kịch bản lệnh shell đang sử dụng 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 gắn nó vào một đường dẫn thực tế, nó sẽ trở thành `/my/path/./appended/path, nó sẽ chuyển thành / my / path / appended / path. Vì vậy, nếu tôi không nhầm, // get's interpreted là /./ và do đó /. Điều này cũng tương tự nếu bạn truy cập / home / user //, bạn sẽ đăng nhập / home / user /


3
2018-02-13 13:54





Tôi sẽ đi nhắc nhở hiển thị "lỗi".

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

Các "lỗi" là nhiều hơn ở đây liên quan đến thực tế là dấu nhắc của bạn sử dụng cuối cùng hợp lệ gõ vào đường dẫn để hiển thị, không thực tế "pwd".

Buồn cười;)


1
2018-02-13 13:54



Đồng ý - // trong dấu nhắc là một tác dụng phụ của biến môi trường nhanh chóng của bạn ($PS1) -- thế nào là PS1 được xác định? - Doug Harris
@DougHarris the $PS1 biến được định nghĩa là [\u@\h \W]\$. Bất kỳ vấn đề với thiết lập? - Summer_More_More_Tea
Odd. Nếu tôi thử PS1, tôi chỉ có một / khi pwd = /. Tôi tự hỏi nếu bạn đang làm bất kỳ công việc phụ để có được thư mục. Là $PROMPT_COMMAND bộ? - 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ể xin 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 PS1 và PROMPT_COMMAND -- sử dụng man bash tại dòng lệnh của bạn hoặc đọc online - Doug Harris


Tính năng của nó 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 với các đường dẫn như ví dụ ở cuối. Vì vậy, đĩa CD của bạn sẽ không nhận được bất kỳ lỗi nào và bạn không phải thay đổi không gian làm việc biến.

MY_WORKSPACE = / home / your_username / workspace /
MY_NEW_PROJECT = $ MY_WORKSPACE / my_proj /
cd $ MY_NEW_PROJECT

nội dung hoàn chỉnh của biến dự án là

/ home / your_username / workspace // my_proj /


1
2018-02-14 07:47