Apa keajaiban "-" (tanda hubung) dalam parameter baris perintah?

101

Contoh:

  • Buat image ISO dan bakar langsung ke CD.

    mkisofs -V Photos -r /home/vivek/photos | cdrecord -v dev=/dev/dvdrw -

  • Ubah ke direktori sebelumnya.

    cd -

  • Dengarkan pada port 12345 dan untar data dikirim ke sana.

    nc -l -p 12345 | tar xvzf -

Apa tujuan tanda hubung dan bagaimana cara menggunakannya?

chemila
sumber

Jawaban:

111

Jika yang Anda maksud adalah telanjang -di akhir tarperintah, itu umum pada banyak perintah yang ingin menggunakan file.

Ini memungkinkan Anda untuk menentukan input atau output standar daripada nama file sebenarnya .

Itu kasus untuk contoh pertama dan ketiga Anda. Misalnya, cdrecordperintah mengambil input standar (aliran image ISO yang dihasilkan oleh mkisofs) dan menulisnya langsung ke /dev/dvdrw.

Dengan cdperintah, setiap kali Anda mengubah direktori, itu menyimpan direktori asal Anda. Jika Anda cdmenggunakan -"nama direktori" khusus , ia menggunakan direktori yang diingat itu daripada yang asli. Anda dapat dengan mudah beralih di antara dua direktori dengan cukup cepat dengan menggunakan itu.

Perintah lain mungkin diperlakukan -sebagai nilai khusus yang berbeda .

paxdiablo
sumber
9
catatan Anda juga dapat menggunakan -untuk cabang git, yaitu Anda dapat beralih kembali ke cabang sebelumnya dengangit checkout -
snappieT
3
Di manakah dalam dokumen tar menjelaskan bahwa itu didukung? Bagaimana saya tahu perintah mana yang mendukungnya?
1
Jika sebuah perintah memiliki arti khusus untuk -, Anda dapat menemukan penjelasannya di halaman manual.
codeforester
su - #membuat shell sebagai shell login
atongsa
Saya menemukan perintah seperti ini sangat aneh: tar -cvf - / home | aescrypt -e -p apples -> backup_files.tar.aes yang sebenarnya adalah tar -cvf - / home | aescrypt -e -p apples -o backup_files.tar.aes - karena karakter perpipaan | harus membuat kehadiran tanda hubung terakhir tidak diperlukan. Tetapi tanpa tanda hubung terakhir, perintah gagal. Kedengarannya tidak masuk akal. Bisakah seseorang memberi saya referensi di mana makna tanda hubung telanjang di baris perintah dijelaskan. Saya tidak dapat menemukan satupun.
elmclose
22

Ini bukan sihir. Beberapa perintah diartikan -sebagai pengguna yang ingin membaca dari stdin atau menulis ke stdout; tidak ada yang istimewa tentang itu untuk cangkang.

Ignacio Vazquez-Abrams
sumber
9
Kecuali dalam kasus cd -; bash(1)menangani cd -seolah-olah Anda telah menulis cd $OLDPWD.
sarnold
6
@sarnold Tapi intinya sama, cd- perintah built-in shell - menafsirkan tanda hubung itu sendiri. Tidak ada "ajaib" :-)
2
@pst, yakin, tidak ada sihir (itu semua hanya kode :), tapi ada adalah sesuatu yang khusus tentang hal itu ke shell.
sarnold
10

-artinya persis seperti yang diinginkan setiap perintah. Ada beberapa kesepakatan umum, dan Anda telah melihat contoh sebagian besar di jawaban lain, tetapi tidak satupun yang 100% universal.

Tidak ada keajaiban tentang -karakter sejauh menyangkut cangkang (kecuali bahwa cangkang itu sendiri, dan beberapa perintah bawaannya seperti cddan echo, gunakan dengan cara konvensional). Beberapa karakter, seperti \,, 'dan ", bersifat "ajaib", memiliki makna khusus di mana pun mereka muncul. Ini adalah "metakarakter shell". -tidak seperti itu.

Untuk melihat bagaimana sebuah perintah menggunakan -, baca dokumentasi untuk perintah itu .

Keith Thompson
sumber
7

Keajaiban ada dalam konvensi. Selama ribuan tahun, orang telah menggunakan '-' untuk membedakan opsi dari argumen, dan telah menggunakan '-' dalam nama file yang berarti stdin atau stdout, sebagaimana mestinya. Jangan meremehkan kekuatan konvensi!

William Pursell
sumber
Jangan melebih-lebihkan kemampuan orang untuk membedakan tata krama berbicara dari ekspresi literal. Ini tidak berlangsung selama ribuan tahun.
tripleee
1
@tripleee - Benar, tetapi ini telah berlangsung selama miliaran detik. ;-)
David R Tribble
5

Ini berarti menggunakan aliran input standar program.

Dalam kasus cd, itu berarti sesuatu yang berbeda: ubah ke direktori kerja sebelumnya.

Brian Cain
sumber