Là `-` chỉ được sử dụng với cd?


45

cd - có thể chuyển đổi giữa thư mục hiện tại và thư mục trước.

Có vẻ như tôi đã thấy -được sử dụng làm đối số cho các lệnh khác trước đây, mặc dù tôi không nhớ nếu -có nghĩa giống như với cd.

Tôi thấy rằng -không làm việc với ls.

Chỉ - được sử dụng với cd?


8
Một điều cần lưu ý là đó cdlà một nội trang, không phải là lệnh bên ngoài (cũng không có cách nào để làm việc như một). cd -do đó là một tính năng cấp vỏ.
fluffy

6
Tôi sử dụng tất cả thời gian git checkout -để chuyển sang chi nhánh trước đó
wim

@fluffy: Được -sử dụng với các nội dung khác theo cùng một cách?
Tim

Đối với một số nội dung xử lý thư mục như pushd, vâng. Mặt khác, ý nghĩa của "thư mục trước" không phải là một mặc định cực kỳ hữu ích.
lông mịn

1
Có lẽ bạn đang nghĩ đến tính năng '~ -' của bash (được hiểu là $ OLDPWD). Điều đó có thể được sử dụng với 'ls' theo cách bạn mô tả.
abonet

Câu trả lời:


22

Nguyên tắc cú pháp tiện ích POSIX (cụ thể là # 13) chỉ định rằng đối với các tiện ích mong muốn đọc tên tệp, -có nghĩa là đầu vào tiêu chuẩn và cho các tiện ích mong muốn tên tệp ghi vào, -có nghĩa là đầu ra tiêu chuẩn. Ví dụ, cat somefile -sao chép nội dung của somefileđầu ra tiêu chuẩn của nó, theo sau là những gì nó đọc trên đầu vào tiêu chuẩn của nó.

Hướng dẫn này không áp dụng cho cdlệnh vì nó không đọc hoặc ghi vào tệp. cdlàm một cái gì đó khác nhau: đối số -có nghĩa là thư mục trước đó. Lệnh cd -tương đương với cd "$OLDPWD" && pwd. Hành vi này là cụ thể cho cdlệnh và các lệnh được truyền cảm hứng trực tiếp như pushd.

Lưu ý rằng đó -là một toán hạng, không phải là một tùy chọn. Chỉ các đối số bắt đầu bằng -và không chỉ -hoặc --là các tùy chọn. Ý nghĩa chính của việc là một toán hạng là --không ảnh hưởng đến ý nghĩa đặc biệt của nó. Ví dụ: cd -- -Pthay đổi thư mục con được gọi -P, nhưng cd -- -giống như cd -, nó không thay đổi thành thư mục được gọi -. Tương tự, cat -- -không đọc từ một tệp được gọi -nhưng từ đầu vào tiêu chuẩn.


46

-được định nghĩa trong Nguyên tắc Cú pháp Tiện ích POSIX làm đầu vào tiêu chuẩn:

Guideline 13:
For utilities that use operands to represent files to be opened for either 
reading or writing, the '-' operand should be used to mean only standard input 
(or standard output when it is clear from context that an output file is being 
specified) or a file named -.

Bạn có thể thấy định nghĩa này cho các tiện ích hoạt động với các tệp để đọc hoặc viết. cdkhông thuộc về các tiện ích này, vì vậy -trong cd không tuân theo hướng dẫn này.

Ngoài ra, POSIX cũng được định nghĩa -có ý nghĩa riêng với cd :

-
    When a <hyphen> is used as the operand, this shall be equivalent to the 
    command:

    cd "$OLDPWD" && pwd

    which changes to the previous working directory and then writes its name.

36

cd -thực sự là viết tắt cho cd "$OLDPWD" && pwd, nơi $OLDPWDđược đặt mỗi khi bạn thay đổi thư mục thành thư mục bạn vừa ở.

Xử lý -phụ thuộc vào ứng dụng. Một số ứng dụng sử dụng -để biểu thị STDIN, ví dụ như grep,awk

Các ứng dụng khác có thể sử dụng -như một cách viết tắt cho bất cứ điều gì chúng chọn, như câu trả lời của Michael chỉ định, với su, -là tốc ký cho--login


vâng, thực sự không có quy tắc cho điều đó.
Kiwy

2
@Kiwy: Với POSIX, có một quy tắc cho điều đó, hãy xem câu trả lời của tôi.
cuonglm

Nói chính xác, có một quy tắc chung, nhưng nó có nhiều trường hợp ngoại lệ. Ngoài ra còn có rất nhiều lệnh có trước quy tắc hoặc các triển khai cũ chưa được cập nhật để tuân thủ quy tắc.
Barmar

19

Mặc dù Michael nói rằng suvà các ứng dụng khác có thể sử dụng -để có nghĩa là bất cứ điều gì họ muốn (đọc từ stdin là phổ biến), Git không sử dụng -trong một thời trang tương tự như cách cdlàm , để thay đổi các chi nhánh.

$ git status
On branch master

$ git checkout foobar
$ git status
On branch foobar

$ git checkout -
$ git status
On branch master

18

Bất kỳ chương trình nào cũng có thể sử dụng -như một đối số, có nghĩa là bất cứ điều gì họ muốn. Một ví dụ phổ biến là su, sử dụng -như tốc ký --login. Quy ước duy nhất tôi có thể nghĩ đến là các chương trình đọc từ các tệp thường sử dụng -có nghĩa là "đọc từ stdin" , nhưng nó hoàn toàn phụ thuộc vào chương trình


Có các quy ước tiêu chuẩn hoặc không tiêu chuẩn để sử dụng các ký hiệu đặc biệt làm đối số không?
Tim

2

Thêm hai xu của tôi ở đây. Tôi sử dụng '-' để báo cho công cụ ps2pdf đọc từ đầu vào tiêu chuẩn, như nhiều người đã đề xuất trước đây:

man -t ls | ps2pdf - ls.pdf

Một-liner ở trên tạo ra một phiên bản pdf của trang man cho ls trong thư mục hiện tại.
Hy vọng ai đó thấy nó hữu ích :).


2

Như được trả lời bởi gnouc , -có ý nghĩa riêng của nó trong cd.

Tuy nhiên, bạn có thể sao chép hành vi của -các chương trình khác bằng cách sử dụng ~-. Ví dụ:

cd /etc
cd /
ls ~-             #lists the contents of the /etc directory
vim ~-/fstab      #opens the file /etc/fstab in vim
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.