it-swarm-tr.com

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

Kısa bir süre önce Shell komut dosyasını incelemeye başladım ve Shell komut dosyasındaki bir dizi satırı yorumlayabilmek istiyorum. C/Java durumunda olduğu gibi demek istiyorum:

/* comment1
   comment2 
   comment3
*/`

Bunu nasıl yapabilirim?

131

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

Örneğin:

: '
This is a
very neat comment
in bash
'
242
Vegas

Bash olarak ç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
92
David Okwii

Bash bir yerleşik sağlamıyor ancak mevcut bash sözdizimini kullanan kesitler var. En basit olanı bir HEREDOC kullanmak, ancak ne yaptığınızı açıkça belirtmek ve aynı HEREDOC işaretçisini her yerde kullanmaktır:

<< --MULTILINE-COMMENT--
line 1
line 2

line 3
line 4
--MULTILINE-COMMENT--

Bazı yazılar, bazı Shell ayrıştırma yan etkilerini önlemek için HEREDOC markörünün alıntılanması gerektiğini belirtir. Bunu sadece yorumunuzda ters alıntı kullanıyorsanız gerekli buldum. Yorumda belirtilen set -o verbose ve $variables olsa bile, işaretçiyi alıntılamak gerekli değildir. YMMV.

Başka bir cevapta belirtilen : ' yaklaşımını kullanırsanız, bunun bir meta yorumla ne olduğunu belgeleyin, her yerde aynı meta yorumu kullanın ve yorum içindeki ' oluşumlarını ikiye katlamayı unutmayın (bir sözdizimi renklendirme düzenleyicisi bunu açıkça ortaya koyar) ):

: 'Multiline comment:
line 1
line 2 we''re going to try this eventually
line 3
'

Her ikisi de hack, böylece gelecekte senaryoları kırabilirler.

Kesinlikle başka teknikler de var, ancak bunu yapmanın "geleneksel" bir yolu yok gibi görünüyor.

19
Oliver

Buradaki diğer cevapları okuduktan sonra, aşağıda IMHO'nun bir yorum olduğu açıkça anlaşılıyor; Özellikle senaryo içi kullanım bilgileri için uygun:

<< ////

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 çizgi dizisi beynime hemen bir yorum olarak kaydolur (eğik çizgiler normalde çizgi yorumları için kullanılsa bile).

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

14
noamtm

bu konudaki fikrin nedir?

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
  }
}
3
Imre

İşte bash olarak çok satırlı yorumlarım nasıl.

Bu mekanizmanın takdir ettiğim iki avantajı var. Birincisi, yorumlar iç içe geçebilir. Diğeri ise, başlangıç ​​çizgisini yorumlayarak blokların 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 bu çıktıyı üretecektir:

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

# Tembellik ve sadeliği severim. Komik bir geçici çözümle # kullanırım:

1 BASIN:] ctrl + F veya cmd + F veya her neyse [bulma işlevini tetiklemek için bulun

2 Şunun gibi bulma alanında bir regex kullanın: (^.+)

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


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

  1. Seçin, metni istediğiniz yere kopyalayın ve çevrimiçi regex aracına yapıştırın
  2. Regex olarak (^.+) ve ikame desenleri olarak #$1 veya #\1 kullanın
  3. Seçin, metni kopyalayın ve başladığınız yere tekrar yapıştırın

# Kargaşanın tadını çıkar!

0
AMDP