Komentar sebaris untuk Bash?

142

Saya ingin dapat mengomentari satu bendera dalam satu perintah. Bash sepertinya hanya punya from # till end-of-linekomentar. Saya melihat trik seperti:

ls -l $([ ] && -F is turned off) -a /etc

Itu jelek, tapi lebih baik daripada tidak sama sekali. Apakah ada cara yang lebih baik?

Tampaknya ini berfungsi, tetapi saya tidak yakin apakah ini portabel:

ls -l `# -F is turned off` -a /etc
Lajos Nagy
sumber
The #commentTrik ini juga disebutkan di sini: stackoverflow.com/questions/9522631/...
Juha Palomäki
1
Mengikuti tautan yang disebutkan oleh @Juha Palomäki, ada trik luar biasa yang ${IFS#comment}diperkenalkan oleh @pjh di komentar. Tidak ada sub-shell yang dipanggil.
alexis

Jawaban:

110

Pilihan saya adalah:

Mengomentari dalam skrip Bash

Ini akan memiliki beberapa overhead, tetapi secara teknis itu menjawab pertanyaan Anda

echo abc `#put your comment here` \
     def `#another chance for a comment` \
     xyz etc

Dan untuk jaringan pipa secara khusus, ada solusi yang lebih bersih tanpa overhead

echo abc |        # normal comment OK here
     tr a-z A-Z | # another normal comment OK here
     sort |       # the pipelines are automatically continued
     uniq         # final comment

Cara memasang komentar baris untuk perintah multi-baris

Rafareino
sumber
3
Perhatikan bahwa Anda harus menggunakan backticks, $(#comment)tidak berfungsi.
funroll
1
Beberapa versi akan menganggapnya )sebagai bagian dari komentar itu sendiri. Sebagian besar tantangan bash adalah karena kompatibilitas retro dengan versi yang lebih lama, dan salah satu strategi umum adalah menggunakan solusi tertua yang mungkin.
Rafareino
2
Catatan, ini bukan komentar nyata: true && `# comment` && trueadalah ekspresi yang valid. Sebuah komentar nyata akan menghasilkan sesuatu seperti: syntax error near unexpected token && '`
Sebastian Wagner
Anda benar @sebastianwagner, perhatikan juga bahwa itu akan gagal dalam hubungan pendek ATAU atau semacamnya, tapi saya pikir itu sama baiknya dengan yang bisa kita dapatkan tanpa menyulitkan banyak hal. Bagi saya itu pertanda bahwa seseorang membutuhkan bahasa yang lebih baik, tetapi ini bisa bagus, mempertahankan kode yang sudah dibangun dengan 'coments' untuk mendokumentasikannya.
Rafareino
Terima kasih itu membantu saya!
xiarnousx
58

Saya merasa paling mudah (dan paling mudah dibaca) hanya menyalin garis dan mengomentari versi aslinya:

#Old version of ls:
#ls -l $([ ] && -F is turned off) -a /etc
ls -l -a /etc
Dan
sumber
Suara positif untuk kejelasan. Tidak tahu mengapa ini bukan opsi pertama.
David Tabernero M.
tapi kemudian itu tidak sebaris? Saya kira itu adil untuk mengatakan bahwa perlu melakukan hal-hal yang tidak didukung oleh bash ini adalah alasan untuk menemukan cara lain
ThorSummoner
25

$(: ...) sedikit kurang jelek, tapi tetap tidak baik.

Ignacio Vazquez-Abrams
sumber
2
Dengan sintaks ini Anda menjalankan sub-shell, sebuah komentar dianggap untuk meningkatkan redabilitas tanpa mengubah perilaku kode sama sekali, tetapi waktu untuk memulai / mengakhiri sub shell ini akan membuat kode Anda menjadi lebih lambat (untuk sedikitnya), mengapa tidak menggunakan hanya titik dua di awal baris baru?
Rafareino
1
Dengan $ {IFS # ...} tidak ada sub-shell yang dipanggil.
alexis
3
@ Rafareino: yeah. Tapi serius, dalam 95% aplikasi overhead ini tidak masalah sama sekali. Untuk banyak kasus di mana itu penting, itu mungkin ide yang baik untuk menggunakan bahasa yang lebih cepat daripada Bash di tempat pertama.
leftaroundabout
... masalahnya adalah, $(: ...)sintaks sepertinya tidak memungkinkan untuk menyematkan komentar: sedangkan echo "foo" `# comment` "bar"akan menghentikan komentar pada backtick kedua, padanan yang seharusnya echo "foo" $(: # comment) "bar"tidak menguraikan apa pun di belakang #.
leftaroundabout
4

Bagaimana kalau menyimpannya dalam variabel?

#extraargs=-F
ls -l $extraargs -a /etc
Karoly Horvath
sumber
4

Inilah solusi saya untuk komentar sebaris di antara beberapa perintah yang disalurkan.

Contoh kode tanpa komentar:

    #!/bin/sh
    cat input.txt \
    | grep something \
    | sort -r

Solusi untuk komentar pipa (menggunakan fungsi pembantu):

    #!/bin/sh
    pipe_comment() {
        cat - 
    }
    cat input.txt \
    | pipe_comment "filter down to lines that contain the word: something" \
    | grep something \
    | pipe_comment "reverse sort what is left" \
    | sort -r

Atau jika Anda lebih suka, inilah solusi yang sama tanpa fungsi pembantu, tetapi ini sedikit berantakan:

    #!/bin/sh
    cat input.txt \
    | cat - `: filter down to lines that contain the word: something` \
    | grep something \
    | cat - `: reverse sort what is left` \
    | sort -r
KylePDavis
sumber
7
Sebagai tambahan, jika Anda memindahkan karakter pipa ke akhir baris sebelumnya, Anda dapat menyingkirkan garis miring terbalik newucky.
tripleee
3

Sebagian besar perintah memungkinkan arg untuk datang dalam urutan apa pun. Cukup pindahkan bendera yang dikomentari ke akhir baris:

ls -l -a /etc # -F is turned off

Kemudian untuk mengaktifkannya kembali, cukup batalkan komentar dan hapus teks:

ls -l -a /etc -F
leedm777
sumber
1
Sial, saya menambahkan #tanpa spasi tunggal setelah perintah. Terima kasih!
asgs
1

Jika Anda tahu suatu variabel kosong, Anda bisa menggunakannya sebagai komentar. Tentu saja jika tidak kosong itu akan mengacaukan perintah Anda.

ls -l $ {1 # -F dimatikan} -a / etc

§ 10.2. Substitusi Parameter

Steven Penny
sumber
Gunakan ${name:=comment}untuk aman.
can-ned_food
1

Untuk menonaktifkan bagian dari perintah seperti a && b, saya cukup membuat skrip kosong xyang ada di jalur, sehingga saya dapat melakukan hal-hal seperti:

mvn install && runProject

ketika saya perlu membangun, dan

x mvn install && runProject

saat tidak (menggunakan Ctrl + Adan Ctrl + Euntuk pindah ke awal dan akhir).

Seperti disebutkan dalam komentar, cara lain untuk melakukannya adalah Bash built-in :alih - alih x:

$  : Hello world, how are you? && echo "Fine."
Fine.
Ondra Žižka
sumber
2
:string; of; commands; : disabled; enabled;
Bangunan
Bahkan lebih baik :) Terima kasih
Ondra Žižka
-1

Jika komentar itu layak untuk dibuat, mungkin komentar tersebut bisa masuk di akhir baris, atau pada baris sendiri. Saya jarang menemukan kebutuhan untuk komentar dalam-baris dengan kode sebelum dan sesudah komentar dalam bahasa apa pun.

Oh, ada satu pengecualian, yang merupakan dialek SQL yang biasanya saya gunakan yang menggunakan '{komentar}'. Kadang-kadang, saya akan menulis:

CREATE UNIQUE INDEX u1_table ON Table(...);
CREATE {DUPS} INDEX d1_table ON Table(...);

Tetapi bahkan itu adalah peregangan.

Jonathan Leffler
sumber