Saya mencari noop di bash (:), tetapi tidak dapat menemukan informasi yang baik. Apa tujuan pasti atau kasus penggunaan operator ini?
Saya mencoba mengikuti dan berfungsi seperti ini untuk saya:
[mandy@root]$ a=11
[mandy@root]$ b=20
[mandy@root]$ c=30
[mandy@root]$ echo $a; : echo $b ; echo $c
10
30
Tolong beri tahu saya, kasus penggunaan apa pun dari operator ini secara waktu nyata atau di tempat mana pun yang diwajibkan untuk menggunakannya.
:
built-in ada di bourne shell dan ksh serta bash.:
di tldp.org/LDP/abs/html/special-chars.htmlJawaban:
Itu ada lebih karena alasan sejarah. Colon builtin
:
sama persis dengantrue
. Ini tradisional untuk digunakantrue
ketika nilai yang dikembalikan penting, misalnya dalam loop tak terbatas:Ini tradisional untuk digunakan
:
ketika sintaks shell memerlukan perintah tetapi Anda tidak ada yang harus dilakukan.Tanggal
:
bawaan semua jalan kembali ke shell Thompson , itu hadir di Unix v6 .:
adalah indikator label untukgoto
pernyataan shell Thompson . Label bisa berupa teks apa saja, jadi:
digandakan sebagai indikator komentar (jika tidak adagoto comment
, maka: comment
secara efektif adalah komentar). The Bourne shell tidak memilikigoto
tapi terus:
.Idiom umum yang digunakan
:
adalah: ${var=VALUE}
, yang disetelvar
keVALUE
jika tidak disetel dan tidak melakukan apa pun jikavar
sudah disetel. Konstruksi ini hanya ada dalam bentuk substitusi variabel, dan substitusi variabel ini perlu menjadi bagian dari perintah: perintah no-op berfungsi dengan baik.Lihat juga Apa tujuan usus besar builtin? .
sumber
#
untuk komentar (atau#!/bin/sh
shebang); yang:
perintah diperkenalkan komentar, dan celakalah programmer naif yang membuat bagus kotak bintang di komentar mereka:: ****
(atau, lebih buruk lagi,: * * *
).: * * *
?:
merupakan sebuah perintah, shell masih harus memproses argumennya sebelum dapat menemukan yang:
mengabaikannya. Kebanyakan, Anda hanya membuat shell melakukan pekerjaan ekstra untuk memperluas*
daftar file di direktori saat ini; itu tidak akan benar-benar mempengaruhi cara kerja skrip.set -e
. Bagaimanapun, semoga kita semua setuju untuk menggunakan#
:)while : ; do ... ; done
jika saya ingin loop tak terbatas yang cepat dan kotor. (Biasanya adasleep
di loop, dan saya mengetik Ctrl-C untuk membunuhnya.)Saya menggunakannya untuk pernyataan if ketika saya mengomentari semua kode. Misalnya Anda memiliki tes:
tetapi Anda ingin memberi komentar sementara semua yang ada di dalamnya:
Yang menyebabkan bash memberikan kesalahan sintaks:
Bash tidak boleh memiliki blok kosong (WTF). Jadi Anda menambahkan no-op:
atau Anda dapat menggunakan no-op untuk mengomentari baris:
sumber
Jika Anda menggunakan
set- e
maka|| :
adalah cara yang bagus untuk tidak keluar dari skrip jika terjadi kegagalan (secara eksplisit membuatnya lulus).sumber
|| :
kemudian nanti menangani kesalahan sendiri denganexit 0
akan membiarkan Anda menampilkan semua stdout dan stderr ke jendela aplikasi selama debugging. Pertimbangkan{ foo ... 2>&1; } || :
mana yang lebih sederhana daripada memasang perangkap yang lebih kompleks dan jika-maka.Anda akan menggunakan
:
untuk memberikan perintah yang berhasil tetapi tidak melakukan apa pun. Dalam contoh ini, perintah "verbosity" dimatikan secara default, dengan menyetelnya ke:
. Opsi 'v' mengaktifkannya.sumber
$(verbosity $i)
nanti (dan secara kondisional) tidak melakukan apa pun.Abaikan
alias
argumenTerkadang Anda ingin memiliki alias yang tidak membutuhkan argumen apa pun. Anda dapat melakukannya dengan menggunakan
:
:sumber
:
kerjanya. Contoh yang Anda berikan tampaknya berlebihan.#
#
akan membuat semua yang muncul secara sintaksis setelah pada baris yang sama diabaikan. Ini sangat berbeda (pertimbangkanmy_alias arg ; other_command
atau, sebaliknya,my_alias arg1 {BACKSLASH}{NEWLINE} arg2
), dan mungkin bukan yang Anda inginkan karena dapat menyebabkan kesalahan sintaks (coba tebakwhile my_alias ; do true ; done
atau yangwhile true ; do my_alias ; done
akan dilakukan).Satu kegunaannya adalah sebagai komentar multiline, atau untuk mengomentari sebagian kode Anda untuk tujuan pengujian dengan menggunakannya bersama dengan file di sini.
Jangan lupa untuk menggunakan tanda kutip
EOF
agar kode apa pun di dalamnya tidak dapat dievaluasi, seperti$(foo)
. Hal ini juga mungkin layak menggunakan nama terminator intuitif sepertiNOTES
,SCRATCHPAD
, atauTODO
.sumber
Dua milikku.
Sematkan komentar POD
Aplikasi yang cukup funky
:
adalah untuk menanamkan komentar POD dalam skrip bash , sehingga halaman manual dapat dibuat dengan cepat. Tentu saja, seseorang pada akhirnya akan menulis ulang seluruh skrip di Perl ;-)Pengikatan fungsi run-time
Ini adalah semacam pola kode untuk fungsi pengikatan pada waktu proses. Fi, miliki fungsi debugging untuk melakukan sesuatu hanya jika flag tertentu disetel:
Anda mendapatkan:
sumber
Terkadang klausa tanpa operasi dapat membuat kode Anda lebih mudah dibaca.
Itu bisa jadi masalah opini, tapi inilah contohnya. Misalkan Anda telah membuat fungsi yang bekerja dengan mengambil dua jalur unix. Ini menghitung 'jalur perubahan' yang diperlukan untuk cd dari satu jalur ke jalur lainnya. Anda menempatkan batasan pada fungsi Anda bahwa jalur harus dimulai dengan '/' ATAU keduanya tidak boleh.
Beberapa pengembang ingin menghapus no-op tetapi itu berarti meniadakan kondisional:
Sekarang-menurut pendapat saya- tidak begitu jelas dari klausa if kondisi di mana Anda ingin melewatkan melakukan fungsi. Untuk menghilangkan no-op dan melakukannya dengan jelas, Anda perlu memindahkan klausa if dari fungsi:
Kelihatannya lebih baik, tetapi seringkali kita tidak dapat melakukan ini; kami ingin pemeriksaan dilakukan di dalam fungsi.
Jadi seberapa sering ini terjadi? Tidak terlalu sering. Mungkin sekali atau dua kali setahun. Itu cukup sering terjadi, sehingga Anda harus menyadarinya. Saya tidak segan-segan menggunakannya ketika menurut saya itu meningkatkan keterbacaan kode saya (terlepas dari bahasanya).
sumber
:
, Anda harus menggunakan:
, bukantrue
, dalam jawaban. Yang mengatakan, cara termudah untuk meniadakan bersyarat sini adalah dengan menggunakan salah satu[[ ... ]]
perintah dan awalan dengan!
:if ! [[ ( ... && ... ) || ( ... && ... ) ]]; then
.: ${...=...}
bisa dibilang kurang terlihat canggung daripadatrue ${...=...}
. Beberapa mungkin lebih memilihwhile :; do
untukwhile true; do
untuk terseness juga.Agak terkait dengan jawaban ini , menurut saya no-op ini agak nyaman untuk meretas skrip poliglot . Misalnya, berikut adalah komentar yang valid untuk bash dan untuk vimscript:
Tentu, kami mungkin juga menggunakannya
true
, tetapi:
menjadi tanda baca dan bukan kata bahasa Inggris yang tidak relevan memperjelas bahwa ini adalah token sintaks.Adapun mengapa seseorang melakukan hal yang rumit seperti menulis skrip poliglot (selain itu keren): ini terbukti membantu dalam situasi di mana kami biasanya menulis beberapa file skrip dalam beberapa bahasa berbeda, dengan file yang
X
merujuk ke fileY
.Dalam situasi seperti itu, menggabungkan kedua skrip dalam satu file polyglot menghindari pekerjaan apa pun
X
untuk menentukan jalur keY
(itu sederhana"$0"
). Lebih penting lagi, ini membuatnya lebih nyaman untuk bergerak atau mendistribusikan program.Contoh umum. Ada masalah lama yang terkenal dengan shebang: sebagian besar sistem (termasuk Linux dan Cygwin) hanya mengizinkan satu argumen untuk diteruskan ke penerjemah. Shebang berikut:
akan mengaktifkan perintah berikut:
dan bukan yang dimaksudkan:
Dengan demikian, Anda akan menulis skrip pembungkus, seperti:
Di sinilah poliglosia memasuki panggung.
Contoh yang lebih spesifik. Saya pernah menulis skrip bash yang, antara lain, menggunakan Vim. Saya perlu memberi Vim pengaturan tambahan, yang dapat dilakukan dengan opsi
--cmd "arbitrary vimscript command here"
. Namun, penyiapan itu substansial, sehingga membuat sebaris dalam string akan sangat buruk (jika memungkinkan). Oleh karena itu, solusi yang lebih baik adalah menuliskannya dalam extenso di beberapa file konfigurasi, kemudian membuat Vim membaca file itu dengan-S "/path/to/file"
. Karenanya saya berakhir dengan file polyglot bash / vimscript.sumber
Saya juga menggunakan skrip di dalamnya untuk menentukan variabel default.
sumber
misalkan Anda memiliki perintah yang ingin Anda rangkai untuk kesuksesan yang lain:
tetapi sekarang Anda ingin menjalankan perintah secara kondisional dan Anda ingin menampilkan perintah yang akan dijalankan (dry-run):
jadi jika Anda menyetel DEBUG dan NOEXEC, perintah kedua tidak akan pernah muncul. ini karena perintah pertama tidak pernah dijalankan (karena NOEXEC tidak kosong) tetapi evaluasi fakta tersebut membuat Anda mendapatkan pengembalian 1, yang berarti perintah subordinat tidak pernah dijalankan (tetapi Anda menginginkannya karena ini adalah proses kering). jadi untuk memperbaikinya, Anda dapat mengatur ulang nilai keluar yang tersisa di tumpukan dengan noop:
sumber