Mengapa banyak perintah menyediakan opsi "tenang"?
37
Mengapa banyak perintah menyediakan opsi -qatau --quietuntuk menekan output ketika Anda dapat dengan mudah mencapai hal yang sama dengan mengarahkan output standar ke file null?
Saya menganggap itu sebagian besar sebagai bendera kenyamanan.
Janis
7
Tidak semua perintah digunakan -quntuk menekan semua output. Misalnya, Docker memiliki perintah untuk mencantumkan gambar; docker imagesmenunjukkan tabel yang diformat dengan banyak informasi, sementara docker images -qmenampilkan daftar ID gambar yang sederhana (berguna untuk pemipaan ke perintah lain).
new123456
Jawaban:
71
Meskipun Anda dapat dengan mudah mengarahkan ulang di shell, ada konteks lain di mana itu tidak semudah, seperti ketika menjalankan perintah dalam bahasa lain tanpa menggunakan shell command-line. Bahkan dalam sebuah shell:
untuk mencetak ukuran semua file yang berisi foo. Jika Anda mengarahkan ulang ke /dev/null, Anda kehilangan keduanya finddan grepoutput. Anda harus menggunakan -exec sh -c 'exec grep foo "$1" > /dev/null' sh {} \;(yaitu, menelurkan shell tambahan).
grep -q foo lebih pendek untuk mengetik daripada grep foo > /dev/null
Mengarahkan ke /dev/nullberarti output masih ditulis dan kemudian dibuang, itu kurang efisien daripada tidak menulisnya (dan tidak mengalokasikan, menyiapkan output yang akan ditulis)
yang memungkinkan optimisasi lebih lanjut. Dalam hal grepmisalnya, karena dengan -q, greptahu output tidak diperlukan, ia keluar segera setelah menemukan kecocokan pertama. Dengan grep > /dev/null, itu masih akan mencoba untuk menemukan semua kecocokan.
diam tidak berarti diam . Untuk beberapa perintah, itu berarti mengurangi verbositas (kebalikan dari -v|--verbose). Misalnya, mplayermemiliki a --quietdan a --really-quiet. Dengan beberapa perintah, Anda dapat menggunakan -qqquntuk mengurangi verbositas 3 kali.
Perlu dicatat bahwa di halaman grepmanual kedua opsi -q,, dan -s, disarankan untuk dihindari jika portabilitas menjadi perhatian. grepKeluar awal adalah optimasi penting, tetapi tidak semua program dengan opsi seperti itu dapat melakukannya; curl -smasih akan memproses seluruh data (tetapi poin ke-3 masih berlaku, sehingga menghemat waktu pemrosesan).
Janis
6
@ Janis, itu akan mudah dibawa ke sistem yang sangat lama. Keduanya -qdan -sditentukan oleh POSIX. Jika kita mempertimbangkan sistem yang lama, maka sistem saya sh -c '...' sh {} \;tidak akan berfungsi (dengan s yang kshberbasis sebelumnya sh).
Stéphane Chazelas
Halaman manual menyebutkan: grep gaya USG juga tidak memiliki -q tetapi opsi -snya berperilaku seperti GNU grep. - Saya pikir perbedaan perilaku bisa menjadi masalah. Saya tidak bisa menilai relevansinya.
Janis
Saya sering menggunakan opsi -q dan --quiet ketika saya hanya peduli dengan kode pengembalian suatu perintah dalam sebuah skrip. Alasan yang disebutkan di atas adalah contoh yang lebih baik mengapa.
Mark Stewart
@ StéphaneChazelas: Anda akan kagum betapa banyak bagian dari sistem masih setua itu ... (well, sebenarnya, tidak sebanyak itu ^^ tetapi masih ada beberapa)
Olivier Dulac
3
Itu masih memungkinkan perintah untuk padam ketika dirasa perlu catatan ke layar tetapi biasanya tidak mengeluarkan apa-apa. dengan mengarahkan ulang semua ke nol, tidak ada peluang output terlihat.
Well, diam berarti tidak ada respons yang diharapkan; tidak akan terduga jika kita tetap akan melihat output. (Jika ada sesuatu yang "benar-benar sangat" penting untuk dicetak (dalam proses terminal terlampir) perangkat tty / pty dapat langsung digunakan oleh proses. Contoh untuk itu mungkin penyelidikan interaktif kata sandi, atau semacamnya. )
Janis
2
Meskipun mungkin tergantung pada perintah, -qjuga akan menonaktifkan output stderr. Ini memungkinkan cangkang yang tidak dengan mudah memungkinkan stingr pembodohan untuk stdout (saya melihat Anda, csh& tcsh) untuk menghindari kebisingan.
Beberapa program menyediakan opsi "sunyi" untuk situasi di mana ia mungkin memiliki output bermakna lainnya yang Anda tidak ingin berantakan dengan pesan status. The -qatau setara akan membungkam semua keluaran status program, yang memungkinkan aliran data murni dari, katakanlah, taratau gzip.
Selain semua tanggapan dan poin yang baik di atas. Ini adalah praktik terbaik untuk memberikan opsi yang berlawanan untuk setiap bendera. Jadi, jika ada -v untuk verbositas harus ada -q untuk non-verbositas, cukup atau diam. (ini bukan titik diskusi tetapi ...) Sama seperti seharusnya menjadi pilihan panjang untuk setiap yang pendek, -q dan --quite.
Seperti dalam hampir semua hal dalam bisnis kita, ada banyak cara untuk mendapatkan solusi atau hasil yang sama. Memiliki -q adalah salah satunya.
-q
untuk menekan semua output. Misalnya, Docker memiliki perintah untuk mencantumkan gambar;docker images
menunjukkan tabel yang diformat dengan banyak informasi, sementaradocker images -q
menampilkan daftar ID gambar yang sederhana (berguna untuk pemipaan ke perintah lain).Jawaban:
Meskipun Anda dapat dengan mudah mengarahkan ulang di shell, ada konteks lain di mana itu tidak semudah, seperti ketika menjalankan perintah dalam bahasa lain tanpa menggunakan shell command-line. Bahkan dalam sebuah shell:
untuk mencetak ukuran semua file yang berisi
foo
. Jika Anda mengarahkan ulang ke/dev/null
, Anda kehilangan keduanyafind
dangrep
output. Anda harus menggunakan-exec sh -c 'exec grep foo "$1" > /dev/null' sh {} \;
(yaitu, menelurkan shell tambahan).grep -q foo
lebih pendek untuk mengetik daripadagrep foo > /dev/null
/dev/null
berarti output masih ditulis dan kemudian dibuang, itu kurang efisien daripada tidak menulisnya (dan tidak mengalokasikan, menyiapkan output yang akan ditulis)grep
misalnya, karena dengan-q
,grep
tahu output tidak diperlukan, ia keluar segera setelah menemukan kecocokan pertama. Dengangrep > /dev/null
, itu masih akan mencoba untuk menemukan semua kecocokan.-v|--verbose
). Misalnya,mplayer
memiliki a--quiet
dan a--really-quiet
. Dengan beberapa perintah, Anda dapat menggunakan-qqq
untuk mengurangi verbositas 3 kali.sumber
grep
manual kedua opsi-q
,, dan-s
, disarankan untuk dihindari jika portabilitas menjadi perhatian.grep
Keluar awal adalah optimasi penting, tetapi tidak semua program dengan opsi seperti itu dapat melakukannya;curl -s
masih akan memproses seluruh data (tetapi poin ke-3 masih berlaku, sehingga menghemat waktu pemrosesan).-q
dan-s
ditentukan oleh POSIX. Jika kita mempertimbangkan sistem yang lama, maka sistem sayash -c '...' sh {} \;
tidak akan berfungsi (dengan s yangksh
berbasis sebelumnyash
).Itu masih memungkinkan perintah untuk padam ketika dirasa perlu catatan ke layar tetapi biasanya tidak mengeluarkan apa-apa. dengan mengarahkan ulang semua ke nol, tidak ada peluang output terlihat.
sumber
Meskipun mungkin tergantung pada perintah,
-q
juga akan menonaktifkan outputstderr
. Ini memungkinkan cangkang yang tidak dengan mudah memungkinkan stingr pembodohan untuk stdout (saya melihat Anda,csh
&tcsh
) untuk menghindari kebisingan.Beberapa program menyediakan opsi "sunyi" untuk situasi di mana ia mungkin memiliki output bermakna lainnya yang Anda tidak ingin berantakan dengan pesan status. The
-q
atau setara akan membungkam semua keluaran status program, yang memungkinkan aliran data murni dari, katakanlah,tar
ataugzip
.sumber
Selain semua tanggapan dan poin yang baik di atas. Ini adalah praktik terbaik untuk memberikan opsi yang berlawanan untuk setiap bendera. Jadi, jika ada -v untuk verbositas harus ada -q untuk non-verbositas, cukup atau diam. (ini bukan titik diskusi tetapi ...) Sama seperti seharusnya menjadi pilihan panjang untuk setiap yang pendek, -q dan --quite.
Seperti dalam hampir semua hal dalam bisnis kita, ada banyak cara untuk mendapatkan solusi atau hasil yang sama. Memiliki -q adalah salah satunya.
sumber