Apakah `-` hanya digunakan dengan cd?

45

cd - dapat beralih antara direktori saat ini dan direktori sebelumnya.

Tampaknya saya telah melihat -digunakan sebagai argumen untuk perintah lain sebelumnya, meskipun saya tidak ingat apakah -artinya sama dengan cd.

Saya menemukan itu -tidak berhasil ls.

Apakah - hanya digunakan dengan cd?

Tim
sumber
8
Yang perlu diingat adalah bahwa itu cdadalah builtin, bukan perintah eksternal (juga tidak akan ada cara bahkan berfungsi sebagai satu). cd -dengan demikian merupakan fitur level shell.
lembut
6
Saya menggunakan semua waktu git checkout -untuk beralih ke cabang sebelumnya
wim
@ Fluffy: -Digunakan dengan builtin lain dengan cara yang sama?
Tim
Untuk beberapa builtin penanganan direktori seperti pushd, ya. Kalau tidak, arti "direktori sebelumnya" bukanlah standar yang sangat berguna.
lembut
1
Mungkin Anda memikirkan fitur '~ -' dari bash (yang ditafsirkan sebagai $ OLDPWD). Itu bisa digunakan dengan 'ls' dengan cara yang Anda gambarkan.
abonet

Jawaban:

22

The POSIX pedoman sintaks utilitas (khusus # 13) menentukan bahwa untuk utilitas yang mengharapkan nama file untuk membaca dari, -berarti input standar, dan untuk utilitas yang mengharapkan nama file untuk menulis untuk, -berarti output standar. Misalnya, cat somefile -menyalin konten somefileke output standarnya, diikuti oleh apa yang dibacanya pada input standarnya.

Pedoman ini tidak berlaku untuk cdperintah karena tidak membaca atau menulis ke file. cdmelakukan sesuatu yang berbeda: argumennya -berarti "direktori sebelumnya". Perintah cd -ini setara dengan cd "$OLDPWD" && pwd. Perilaku ini khusus untuk cdperintah, dan untuk perintah yang terinspirasi langsung seperti pushd.

Perhatikan bahwa itu -adalah operan, bukan opsi. Hanya argumen yang dimulai dengan -dan bukan hanya pilihan -atau --opsi. Implikasi utama dari menjadi seorang operan adalah hal --itu tidak memengaruhi makna khususnya. Misalnya, cd -- -Pperubahan ke subdirektori yang dipanggil -P, tetapi cd -- -sama dengan cd -, tidak berubah menjadi direktori yang disebut -. Demikian pula, cat -- -tidak membaca dari file yang dipanggil -tetapi dari input standar.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
46

-didefinisikan dalam Pedoman Sintaks POSIX Utility sebagai input standar:

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 -.

Anda dapat melihat definisi ini untuk utilitas yang beroperasi dengan file untuk membaca atau menulis. cdbukan milik utilitas ini, jadi -dalam cd tidak mengikuti pedoman ini.

Selain itu, POSIX juga didefinisikan -memiliki arti tersendiri dengan 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.
cuonglm
sumber
36

cd -sebenarnya adalah singkatan cd "$OLDPWD" && pwd, di mana $OLDPWDdiset setiap kali Anda mengubah direktori ke direktori yang baru Anda masuki.

Penanganan -tergantung pada aplikasi. Beberapa aplikasi digunakan -untuk menandakan STDIN, misalnya grep,awk

Aplikasi lain dapat digunakan -sebagai singkatan untuk apa pun yang mereka pilih, karena jawaban Michael menentukan, dengan su, -adalah singkatan--login

Lawrence
sumber
ya memang tidak ada aturan untuk itu.
Kiwy
2
@ Kyiwy: Dengan POSIX, ada aturan untuk itu, lihat jawaban saya.
cuonglm
Lebih tepatnya, ada aturan umum, tetapi ada banyak pengecualian. Ada juga banyak perintah yang ada sebelum aturan, atau implementasi lama yang belum diperbarui agar sesuai dengan aturan.
Barmar
19

Meskipun Michael menyebutkan bahwa sudan aplikasi lainnya dapat menggunakan -berarti apapun yang mereka inginkan (dibaca dari stdin umum), Git tidak digunakan -dengan cara yang sama dengan bagaimana cdmelakukan , untuk mengubah cabang.

$ git status
On branch master

$ git checkout foobar
$ git status
On branch foobar

$ git checkout -
$ git status
On branch master
dotancohen
sumber
18

Program apa pun dapat digunakan -sebagai argumen, untuk berarti apa pun yang mereka inginkan. Salah satu contoh umum adalah su, yang digunakan -sebagai singkatan untuk --login. Satu-satunya konvensi yang dapat saya pikirkan adalah bahwa program yang membaca dari file sering digunakan -untuk berarti "membaca dari stdin" , tetapi sepenuhnya tergantung pada program

Michael Mrozek
sumber
Apakah ada konvensi standar atau tidak standar untuk menggunakan simbol khusus sebagai argumen?
Tim
2

Menambahkan dua sen saya di sini. Saya menggunakan '-' untuk memberi tahu alat ps2pdf untuk membaca dari input standar, seperti yang disarankan beberapa orang sebelumnya:

man -t ls | ps2pdf - ls.pdf

One-liner di atas membuat versi pdf dari halaman manual untuk ls di direktori saat ini.
Semoga seseorang menemukan itu berguna :).

gacanepa
sumber
2

Sebagaimana dijawab oleh gnouc , -memiliki arti tersendiri dalam cd.

Namun, Anda dapat mereplikasi perilaku -di program lain menggunakan ~-. Sebagai contoh:

cd /etc
cd /
ls ~-             #lists the contents of the /etc directory
vim ~-/fstab      #opens the file /etc/fstab in vim
Chirag Bhatia - chirag64
sumber