Bash için satır içi yorumlar?


143

Tek satırlık bir komutta tek bir bayrağa yorum yapabilmek istiyorum. Bash'in sadece from # till end-of-lineyorumları var gibi görünüyor . Gibi numaralara bakıyorum:

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

Çirkin, ama hiç yoktan iyidir. Daha iyi bir yol var mı?

Aşağıdaki gibi görünüyor, ancak taşınabilir olup olmadığından emin değilim:

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

#commentHile ayrıca belirtilmiştir: stackoverflow.com/questions/9522631/...
Juha Palomäki

1
@Juha Palomäki tarafından bahsedilen bağlantıyı takiben, yorumlarda @pjh tarafından sunulan bu harika numara var ${IFS#comment}. Alt kabuk çağrılmaz.
alexis

Yanıtlar:


111

Tercih ettiğim:

Bash betiğinde yorum yapma

Bunun biraz yükü olacak, ancak teknik olarak sorunuza cevap veriyor

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

Ve özellikle boru hatları için, ek yükü olmayan daha temiz bir çözüm var

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

Çok satırlı komut için satır açıklaması nasıl eklenir


3
Backtick kullanmanız gerektiğini unutmayın, $(#comment)çalışmaz.
funroll

1
Bazı sürümler ), yorumun kendisinin bir parçası olarak değerlendirilecektir . Bash'ın zorluklarının çoğu, eski sürümlerle retro uyumluluğundan kaynaklanmaktadır ve ortak bir strateji, mümkün olan en eski çözümü kullanmaktır.
Rafareino

2
Bu gerçek bir yorum değildir: true && `# comment` && truegeçerli bir ifadedir. Gerçek bir yorum şöyle bir şey üretecektir: syntax error near unexpected token && ''
Sebastian Wagner

Haklısın @sebastianwagner, ayrıca bir OR kısa devrede veya bunun gibi bir şeyde başarısız olacağını da unutmayın, ancak işleri çok karmaşık hale getirmeden alabileceğimiz kadar iyi olduğunu düşünüyorum. Bana göre bu, daha iyi bir dile ihtiyaç duyulduğunun bir işaretidir, ancak bunu yapmak için halihazırda oluşturulmuş kodu bu tür 'coments'larla koruyarak harika yapabilir.
Rafareino

Bu bana yardımcı oldu teşekkürler!
xiarnousx

58

Sadece kopyalamak ve orijinal sürümü yorumlamak için en kolay (ve en okunabilir) bulmak:

#Old version of ls:
#ls -l $([ ] && -F is turned off) -a /etc
ls -l -a /etc

Açıklık için oy verin. Bunun neden ilk seçenek olmadığını bilmiyorum.
David Tabernero M.9

ama o zaman satır içi değil mi? Ben bu bash tarafından desteklenmeyen şeyler yapmak için gerek başka bir yol bulmak için neden olduğunu söylemek için adil varsayalım
ThorSummoner

25

$(: ...) biraz daha çirkin, ama yine de iyi değil.


2
Bu sözdizimine göre bir alt kabuk çalıştırıyorsunuz, kod davranışını değiştirmeden yeniden okunabilirliği artırmak için bir yorum yapılması gerekiyor, ancak bu alt kabuğa lazım / sonlandırma zamanı, kodunuzun daha yavaş olmasını sağlayacaktır (en azından söylemek gerekirse), neden yeni bir satırın başında sadece iki nokta üst üste kullanmıyorsunuz?
Rafareino

1
$ {IFS # ...} ile alt kabuk çağrılmaz.
alexis

3
@Rafareino: evet. Ama cidden, uygulamaların% 95'inde bu ek yük hiç önemli olmayacak. Önemli olduğu birçok durumda, ilk etapta Bash'ten daha hızlı bir dil kullanmak muhtemelen iyi bir fikir olurdu.
leftaroundabout

... sorun şu, $(: ...)sözdizimi aslında yorumların gömülmesine izin vermiyor gibi görünüyor: oysa echo "foo" `# comment` "bar"ikinci backtick'teki yorumu sonlandıracak, sözde eşdeğer echo "foo" $(: # comment) "bar", arkasındaki hiçbir şeyi ayrıştırmıyor #.
leftaroundabout


4

İşte benim birden çok borulu komut arasında satır içi yorumlar için benim çözüm.

Uncommented kod örneği:

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

Bir boru yorumu için çözüm (bir yardımcı işlev kullanarak):

    #!/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

Ya da isterseniz, yardımcı fonksiyon olmadan aynı çözüm, ancak biraz daha karışık:

    #!/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

7
Bir yana, boru karakterini önceki satırın sonuna taşırsanız, yucky ters eğik çizgi satırlarından kurtulabilirsiniz.
üçlü

3

Çoğu komut, bağımsız değişkenlerin herhangi bir sırada gelmesine izin verir. Yorum yapılan bayrakları satırın sonuna taşıyın:

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

Daha sonra tekrar açmak için metni açın ve metni kaldırın:

ls -l -a /etc -F

1
kahretsin, #komuttan sonra tek bir boşluk olmadan ekledim . teşekkür ederim!
asgs


1

Gibi bir komutun bir bölümünü devre dışı bırakmak için a && b, sadece xyolda olan boş bir komut dosyası oluşturdum , böylece şöyle şeyler yapabilirim:

mvn install && runProject

inşa etmem gerektiğinde ve

x mvn install && runProject

(kullanmıyorsanız zaman Ctrl + Ave Ctrl + Ebaşında ve sonunda geçmek için).

Yorumlarda belirtildiği gibi, bunu yapmanın başka bir yolu da Bash yerleşik : yerine x:

$  : Hello world, how are you? && echo "Fine."
Fine.

2
Böyle bir yapı zaten var: :string; of; commands; : disabled; enabled;
Şurada

Daha da iyi :) Teşekkürler
Ondra 7ižka

-1

Yorum yapılmaya değerse, muhtemelen satırın sonuna veya kendi başına bir satıra gidebilir. Herhangi bir dilde yorumdan önce ve sonra kod ile satır içi yorumlara nadiren ihtiyaç duyuyorum.

Oh, bir istisna var, genellikle kullandığım SQL 'lehçesi' {comments} 'kullanıyor. Bazen şunu yazacağım:

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

Ama bu bile bir gerginlik.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.