Làm thế nào để bạn nhập một thư mục tên đó chỉ là một điểm trừ?


26

Tôi đã tải ít hơn về máy chủ web của mình và giải nén nó.

Nó chứa một thư mục có tên -. Tôi cho rằng tôi biết làm thế nào để đối phó với điều đó, nhưng tôi thì không.

Tôi đã thử cd -- -, nhưng nó không có hiệu quả mong muốn. Sử dụng dấu ngoặc kép dường như cũng không ảnh hưởng đến nó. Tôi đặt dấu gạch chéo khắp nơi, vô ích.

Cách thích hợp để thay đổi vào thư mục này là gì?

Câu trả lời:


34

Bạn muốn tránh nó là một tham số, vì vậy chúng tôi cố gắng trả trước một cái gì đó cho nó. Thư mục hiện tại có thể được truy cập cùng ., do đó thư mục con -có thể được truy cập thay thế bằng ./-.

cd ./-

Lý do cd -- -không hoạt động là vì điều này được triển khai khác nhau nếu bạn so sánh rm(xem man rm) với cd(xem man bashhoặc man cd), cdcó một cách hiểu khác nhau được coi -là một tham số (xem man bashhoặc man cd).

Cũng cần lưu ý rằng đó cdlà một hàm dựng sẵn shell, như có thể được đọc trong câu trả lời này :

cdkhông phải là một lệnh bên ngoài - nó là một hàm dựng sẵn shell. Nó chạy trong ngữ cảnh của shell hiện tại, và không, như các lệnh bên ngoài thực hiện, trong bối cảnh fork / exec'd như một tiến trình riêng biệt.

Có một cdlệnh bên ngoài , nhưng nó làm một cái gì đó hoàn toàn khác .

Điều này giải thích tại sao việc thực hiện lại khác nhau, vì BashCoreutils là hai điều khác nhau.

Hãy giả sử bạn sẽ không tin điều này, làm thế nào để chúng tôi xác nhận điều đó? Sử dụng whichtype.

 $ which cd && type cd
which: no cd in (/usr/local/bin:/usr/bin:/bin:/opt/bin:/usr/x86_64-pc-linux-gnu/gcc-bin/4.7.2:/usr/games/bin
cd is a shell builtin
 $ which rm && type rm
/bin/rm
/bin/rm is /bin/rm

Xem man whichđể biết thêm thông tin và man bashhoặc man typechotype


4
Không, "-" được triển khai trong tất cả các tiện ích tiêu chuẩn, nhưng có nghĩa là kết thúc các tùy chọn. "-" một mình không được công nhận là một tùy chọn mà là thư mục trước đó.
Stéphane Chazelas

4
Giải pháp đúng, nhưng giải thích là sai. Nó hoàn toàn không liên quan đó cdlà một nội dung. Lý do cd -- -không hoạt động -là một toán hạng, không phải là một tùy chọn.
Gilles 'SO- ngừng trở nên xấu xa'

1
trên Mac OS X cd -- -sẽ thay đổi bạn thành một thư mục có tên -trong thư mục hiện tại. FWIW.
Tim Kennedy

Hầu hết các ý kiến ​​đã được phản ánh trong phần thứ hai của bài viết của tôi.
Tamara Wijsman

22

Một dấu trừ (hay còn gọi là dấu gạch ngang) không phải là một tùy chọn, mà là một toán hạng (tức là một đối số không phải là một tùy chọn). Bởi vì điều này, đặt --trước khi nó không có hiệu lực. Dấu gạch ngang là một toán hạng trong cd -và vẫn là một toán hạng trong cd -- -. Giống như các tiện ích tiêu chuẩn khác, cdcoi toán hạng là toán hạng bất kể có --trước đó hay không.

Các cdlệnh gán một ý nghĩa đặc biệt đối với các toán hạng -. Bất cứ điều gì khác là một thư mục để chuyển sang. cd -- -achuyển sang thư mục được gọi -a, bởi vì -anó không đặc biệt như một toán hạng và --ngăn không cho cdnó coi là một tùy chọn. Điều này không làm việc cho -một mình mà không phải là một lựa chọn.

Đặt dấu ngoặc kép xung quanh -sẽ không có ích, vì cuối cùng điều đó sẽ vượt qua toán hạng -.

Do đó, cách duy nhất của bạn là tìm một cách khác để diễn đạt cùng một ý tưởng, tức là một tên khác cho cùng một thư mục. May mắn thay, có một điều dễ dàng: nếu bạn thêm ./trước một tên tệp tương đối, nó vẫn có nghĩa là cùng một tệp. Điều ./này làm cho một sự khác biệt không liên quan trong trường hợp của chúng tôi: CDPATHkhông được tham khảo khi tên thư mục bắt đầu bằng /, ./hoặc ../. Như vậy:

cd ./-

Một cách khác, vì -là một thư mục, là thêm một /sau nó. Thêm một /ở cuối tên tệp đảm bảo rằng tệp được coi là một thư mục (cụ thể, lệnh sẽ hoạt động trên chính thư mục đó chứ không phải trên liên kết tượng trưng nếu tệp là một liên kết tượng trưng đến một thư mục), nhưng nếu không thì không khác nhau. Như vậy:

cd -- -/

Nhân tiện, việc viết -/được đề xuất bởi mã hoàn thành, nhưng trong bash, nó chỉ thực sự hoạt động với --nó trước đó, bash không có trường hợp đặc biệt nào cho cd -/(zsh nào).


Điều đó làm tôi suy nghĩ, tôi thực sự đã cố gắng cd -- -/, nhưng do đã chạy tương đương cd -ngay trước đó, thư mục thực sự không tồn tại và tôi đã hiểu nó là một lần thử thất bại khác.
Der Hochstapler

5

Đủ điều kiện với đường dẫn là một lựa chọn.

cd ./-

2

Đây cũng sẽ làm việc:

cd ~/'-'

hoặc là

cd ~/"-"

1
nhưng chỉ khi nó xảy ra trong thư mục nhà
Rịa

1
Khoan và báo giá là không cần thiết.
Scott
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.