Bash'de çok satırlı yorumlar oluşturmanın yolu nedir?


226

Son zamanlarda kabuk betiği okumaya başladım ve bir kabuk betiğindeki bir dizi satırı yorumlayabilmek istiyorum. Yani C / Java durumunda olduğu gibi:

/* comment1
   comment2 
   comment3
*/`

Bunu nasıl yapabilirim?


2
Hash'i aşağıdaki gibi kullanabilirsiniz: #Bu bir yorumdur.
Mohammad Tayyab

1
Biliyorum ama çok satırlı için biraz zahmetli.
Enes Malik Turhan

2
Aşağıdaki yanıtların :, satırın ilk sütununda (öndeki boşluk yok) olmasını gerektirdiğine dikkat edilmelidir .
ty

Yanıtlar:


394

: 'Açmak ve 'kapatmak için kullanın .

Örneğin:

: '
This is a
very neat comment
in bash
'

27
:( ve ayrıca un-okuma yeteneği ve potansiyel hata kaynağının büyük miktarda ekler IMHO daha iyi sadece çoklu kullanmaktır. #S ve asla bu ...
jm666

51
@ jm666 IMHO Kelimeyi tüm kullanım durumları hakkında hiçbir fikriniz olmadığında asla kullanmak iyi bir fikir değildir .
Kış

19
açıklaması: :kısaltmasıdır trueve trueherhangi bir parametre işlemez. (manuel sayfa:SYNOPSIS true [ignored command line arguments]
phil294

46
Arasındaki boşluk :ve 'önemlidir
Becko

23
Kolayca kodu açıp kapatabilmem için bu kod blokları için biraz değiştirdim. Değişikliğim, # 'tek tırnak yerine son satırda kullanmaktır. Bu şekilde #kod satırını etkinleştirmek için ilk satıra bir tane koyabilirim . #Kodu devre dışı bırakmak için ilk satırı kaldırın .
JohnMudd

131

Bash içinde çok satırlı yorum

: <<'END_COMMENT'
This is a heredoc (<<) redirected to a NOP command (:).
The single quotes around END_COMMENT are important,
because it disables variable resolving and command resolving
within these lines.  Without the single-quotes around END_COMMENT,
the following two $() `` commands would get executed:
$(gibberish command)
`rm -fr mydir`
comment1
comment2 
comment3
END_COMMENT

4
Bu işe yarıyor, şu anda kabul edilen cevap (benim için).
Freek

5
Muhtemelen bunun kendi başına bir yorum olmadığını belirtmek gerekir. Bu, NOP komutuna çok satırlı dize olarak yönlendirilen bir heredoc. Değişkenlerin ve komutların çözümlenmesini devre dışı bırakmak için tek tırnak önemlidir.
Nux

1
@Freek boşluk eklemeniz gerekiyor
mazs

Ben bu shebang hattı üzerinden çalışan basit bir bash betiği, Debian #! / Bin / bash ile test ve başarısız oldu. Bu sayfadaki her bir cevabı deniyorum ve aşağıdaki soruya ulaşana kadar hepsi başarısız oldu. Başarısız olduklarından beri onları aşağı oyluyorum ve gerçekten düzgün çalışanı oyluyorum.
PyTis

1
Örneğinizde iyi testler. Öncü :gerekli değildir. Sadece başlayın <<.
wisbucky

34

Bu yayını yorumlara ve diğer yanıtlara göre güncelliyorum, bu nedenle 22 Mayıs 2020'den önceki yorumlar artık geçerli olmayabilir.

Bash, çok satırlı yorum için yerleşik bir sözdizimi sağlamaz, ancak mevcut bash sözdizimini kullanan "şimdi işe yarar" hackler vardır.

Şahsen ben en basit (yani en az gürültülü, en az garip, yazması en kolay, en açık) bir alıntı HEREDOC kullanmak, ama ne yaptığını açık yapmak ve her yerde aynı HEREDOC işaretleyici kullanmak olduğunu düşünüyorum:

<<'### BLOCK COMMENT'
line 1
line 2

line 3
line 4
### BLOCK COMMENT

HEREDOC markörünün tekli alıntılanması, çökmeye veya çıktıya neden olacak garip alt yüklenmeler ve hatta markörün kendisinin ayrıştırılması gibi bazı kabuk ayrıştırma yan etkilerini önler. Böylece tek tırnaklar size açık-kapalı yorum işaretçisi üzerinde daha fazla özgürlük verir. Örneğin, aşağıda bash'da çok satırlı yorum öneren üçlü bir karma kullanılır. Tek tırnak işaretleri yoksa komut dosyası çökecektir. Kaldırsanız bile , tek tırnak ###için FOO{}olmasaydı betiğin çökmesine neden olur (veya hayır ise kötü ikame yazdırılmasına neden olur set -e):

set -e

<<'### BLOCK COMMENT'
something something ${FOO{}} something
more comment
### BLOCK COMMENT

ls

Tabii ki sadece kullanabilirsiniz

set -e

<<'###'
something something ${FOO{}} something
more comment
###

ls

ancak bunun amacı, bu hileye aşina olmayan bir okuyucu için kesinlikle daha az açıktır.

Günümüzde herhangi bir iyi editör, seçimi kaldırmak / yorum yapmak için ctrl- / veya benzeri tuşlara basmanıza izin verir. Herkes bunu kesinlikle anlıyor:

# something something ${FOO{}} something
# more comment
# yet another line of comment

Kuşkusuz, paragraflarınızı yeniden doldurmak istiyorsanız, yukarıdaki blok yorum kadar neredeyse uygun değildir.

Elbette başka teknikler de var, ama bunu yapmanın "geleneksel" bir yolu yok gibi görünüyor. Eğer güzel olur ###>ve ###<, başlangıç ve yorum bloğunun sonunu belirtmek için bash eklendi oldukça basit olabilir gibi görünüyor olabilir.


1
Ah, bu hatırlanacak kadar kolay / temiz!
Thamme Gowda

1
Önceki yanıt notlarında olduğu gibi, backquotes'un yanı sıra, her iki form da komut ikamesi olduğundan $ (...) dizisi de genişletilecektir.
Perl Ancar

"Her ikisi de hack'tir, böylece gelecekte senaryoları kırabilirler." Bunu genişletebilir misiniz? Anlamsal olarak hack'lere rağmen, sözdizimsel olarak geçerlidirler ve bash çılgına dönmeye karar vermedikçe ve heredocları kırmadığı sürece gelecekte kırılmamalıdır.
Perl Ancar

@perlancar Bilgisayar korsanlarının sorunla tamamen alakasız bir dil / lib özelliği kullanan çözümler olduğunu kabul edersek (bir yorum için bir yorumlu metin kullanma veya benzeri bir komutta parametre kullanma gibi true), '' risk kırma riski (heredoc yaklaşımı yoktur, ancak iki nokta sürümü yapar), 1) hackler hala niyeti gizler: çok satırlı yorum hakkında ilk satır ipucu olmadan, çoğu bu kodun ne yaptığını merak ederek başlarını kayar; ve 2) beklenmedik karanlık köşelere sahip olmak (bir alıntıyı ikiye katlamak, bazı durumlarda heredoc işaretçisini alıntılamak gibi).
Oliver

@Oliver: tırnaksız ise, değişkenler olabilir kötü yan etkileri vardır. Senin içinde gömülü olduğunu düşünün heredoc gibi bir dize -yorum ${FOO:=bar}ya ${FOO{}}. Birincisi, değişkeni yaratmak ve ayarlamak için yan etkiye sahip olabilir FOO, ikincisi kötü bir ikame hatası oluşturur; her iki etkiyi de gerçek bir yorumdan beklemezsiniz.
user1934428

24

Buradaki diğer cevapları okuduktan sonra, IMHO'nun bir yorum olduğunu gerçekten açıkça ortaya koyan aşağıdaki ile geldim. Komut dosyası kullanım bilgileri için özellikle uygundur:

<< ////

Usage:
This script launches a spaceship to the moon. It's doing so by 
leveraging the power of the Fifth Element, AKA Leeloo.
Will only work if you're Bruce Willis or a relative of Milla Jovovich.

////

Bir programcı olarak, eğik çizgiler dizisi hemen beynime bir yorum olarak kaydedilir (eğik çizgiler normalde çizgi yorumları için kullanılsa bile).

Tabii ki, "////"sadece bir dize; önek ve sonekteki eğik çizgi sayısı eşit olmalıdır.


3
Neredeyse özledimUsage:
RNA

Yukarıdaki cevaba büyük katkı. Dürüst olmak gerekirse, sanırım yukarıdaki cevabı düzenleyebilir ve bunu ayrı cevaplamak yerine ekleyebilirsiniz.
PyTis

Birkaç "yukarıda" cevabı vardır (sıralama düzeninize bağlı olarak). Ve ayrıca cevap vererek seçtiğim ipin arkasındaki mantığı açıklamak istedim.
noamtm

<< EOF ... EOF
l mingzhi

5

bunun hakkında ne düşünüyorsun?

function giveitauniquename()
{
  so this is a comment
  echo "there's no need to further escape apostrophes/etc if you are commenting your code this way"
  the drawback is it will be stored in memory as a function as long as your script runs unless you explicitly unset it
  only valid-ish bash allowed inside for instance these would not work without the "pound" signs:
  1, for #((
  2, this #wouldn't work either
  function giveitadifferentuniquename()
  {
    echo nestable
  }
}

merhaba, asıl soruya bir cevaptan ziyade bir soru olarak tasarlanmamıştı
Imre

İyi IMO değil. Yorumun oldukça kısıtlayıcı olan kabuk kodu olarak ayrıştırılabilir olmasını gerektirir .
user1934428

3

İşte bash dilinde çok satırlı yorumları nasıl yapacağım.

Bu mekanizmanın takdir ettiğim iki avantajı var. Birincisi, yorumların iç içe geçebileceği. Diğeri, blokların sadece başlangıç ​​çizgisini yorumlayarak etkinleştirilebilmesidir.

#!/bin/bash
# : <<'####.block.A'
echo "foo {" 1>&2
fn data1
echo "foo }" 1>&2
: <<'####.block.B'
fn data2 || exit
exit 1
####.block.B
echo "can't happen" 1>&2
####.block.A

Yukarıdaki örnekte "B" bloğu yorumlanmıştır, ancak "A" bloğunun "B" bloğu olmayan kısımları yorumlanmamıştır.

Bu örneği çalıştırmak şu çıktıyı üretecektir:

foo {
./example: line 5: fn: command not found
foo }
can't happen

3

Seçilen cevabı denedim, ancak sahip olduğum bir kabuk komut dosyası çalıştırdığımda, her şey ekrana yazdırılıyor (jupyter dizüstü bilgisayarların '''xx'''tırnak içinde her şeyi nasıl yazdırdığına benzer ) ve sonunda bir hata mesajı vardı. Hiçbir şey yapmıyordu, ama: korkutucu . Daha sonra, tek tırnakların birden çok satıra yayılabileceğini fark ettim. Yani .. bloğu bir değişkene atayalım.

x='
echo "these lines will all become comments."
echo "just make sure you don_t use single-quotes!"

ls -l
date

'

Bir değişkene atamaya gerek yok, bu da bir 'yorumdan' beklemediğimiz bir yan etki. Değiştir x=bir tarafından : ve hiçbir yan etkisi ile aynı etkiye sahiptir. Tek dezavantajı, yorumun tek bir alıntı içermemesi gerektiğidir. Bu yüzden alıntı yapılan bir yorumlu metin kullanımını tercih ediyorum: Bununla yorum yapan kişi istediği gibi uygun bir sonlandırma dizesi seçebilir.
user1934428

2

Çok akıllı olmayan basit bir çözüm:

Komut dosyasının bir bölümünü geçici olarak engelleyin:

if false; then
    while you respect syntax a bit, please
    do write here (almost) whatever you want.
    but when you are
    done # write
fi

Biraz sofistike bir versiyon:

time_of_debug=false # Let's set this variable at the beginning of a script

if $time_of_debug; then # in a middle of the script  
    echo I keep this code aside until there is the time of debug!
fi

-2

# Tembellik ve sadeliği seviyorum. Komik bir çözümle # kullanırdım:

1 PRESS:] bul işlevini tetiklemek için ctrl + F veya cmd + F veya her neyse [bul

2 bulma alanında aşağıdaki gibi bir normal ifade kullanın: (^.+)

3 ile değiştirin: # $1veya isterseniz#$1


# Not: editörünüzde üç adım olmayabilir. Bu durumda bir çevrimiçi normal ifade aracı kullanın (politika nedenleriyle burada bir tane öneremezsiniz):

  1. Metni nerede olursanız olun seçin, kopyalayın ve çevrimiçi normal ifade aracına yapıştırın
  2. (^.+)Normal ifade ve #$1veya #\1ikame modelleri olarak kullanın
  3. Metni seçin, kopyalayın ve başladığınız yere yapıştırın

# Karmalarınızın tadını çıkarın!


Günümüzde birçok editör, ctrl+/birden fazla satır için bile yorumları açıp kapatacak kısayol tuşuna sahiptir. Ayrıca, kullandığınız dile göre yorum karakterini de değiştirebilir.
ninMonkey
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.