Çok satırlı kabuk betiği yorumu - bu nasıl çalışır?


92

Son zamanlarda, daha önce hiç görmediğim bir çok satırlı yorum türüne rastladım - işte bir script örneği:

echo a
#
: aaa 
: ddd 
#
echo b

Bu iş gibi görünüyor, hatta vimsözdizimi vurgulamaktadır. Bu yorumlama tarzı ne denir ve bunun hakkında nasıl daha fazla bilgi bulabilirim?


1
Kodunuzu yorumlamak için işlevine eklerseniz ne olur? CommentedOutBlock() { echo "test"; }
Buksy

Yanıtlar:


135

Bu çok satırlı bir yorum değil. #tek satırlı bir yorumdur. :(iki nokta üst üste) , hiçbir şekilde bir yorum değildir, daha ziyade, temelde bir NOP olan, kabaca bir komuttur, aslında geri dönüş dışında hiçbir şey yapmayan boş bir işlemdir true(ve $?yan etki olarak 0'a ayarlanmıştır ). Ancak bir komut olduğu için, argümanları kabul edebilir ve argümanlarını görmezden geldiğinden, çoğu durumda yüzeysel olarak bir yorum gibi davranır. Bu çamurla ilgili temel sorun, argümanların hala genişlediğinden, istenmeyen sonuçlara yol açıyor. Argümanlar hala sözdizimi hatalarından etkilenir, yönlendirmeler hala gerçekleştirilir, böylece : > filekısaltılır fileve : $(dangerous command)değişimler devam eder.

Kabuk betiklerine yorum eklemek için en az şaşırtıcı tamamen güvenli yol şudur #. Çok satırlı yorumlar için bile buna bağlı kalın. Asla: yorumlar için (ab) kullanmaya çalışmayın . Benzer dillerdeki eğik yıldız /* */biçimine benzeyen kabukta özel çok satırlı yorum mekanizması yoktur C.


Tamlık uğruna, ancak uygulama önerildiği için değil, çok satırlı "yorumlar" yapmak için burada-belgelerin kullanılmasının mümkün olduğunu belirteceğim :

: <<'end_long_comment'
This is an abuse of the null command ':' and the here-document syntax
to achieve a "multi-line comment".  According to the POSIX spec linked 
above, if any character in the delimiter word ("end_long_comment" in 
this case) above is quoted, the here-document will not be expanded in 
any way.  This is **critical**, as failing to quote the "end_long_comment" 
will result in the problems with unintended expansions described above. 
All of this text in this here-doc goes to the standard input of :, which 
does nothing with it, hence the effect is like a comment.  There is very 
little point to doing this besides throwing people off.  Just use '#'.
end_long_comment

29
<<Satırda tek tırnak tutmak için +1 çok önemli - bu ikame ve genişlemeyi kapatır.
glenn jackman

4
Ek bir not olarak, yorumlanması :gereken şeyler için kabuk komut dosyalarının doldurulması, fazladan RAM / CPU tüketimine neden olur. Masaüstünüzdeki basit şeyler için uygun olmayacaktır, ancak saniyede yüz binlerce kez yürütülen bir şey olursa , hızlı bir şekilde hiçbir şey yapmazsınız .
bahamat

3
@ bahamat: Saniyede yüzlerce veya binlerce kez bir şey yaparsanız, umarım kabuğuna
yazmazsınız

1
Bazen, null yardımcı programını birden çok metin satırı için kullanmak yararlı olabilir. Yorumun başlatılması, POD'un kabuk komut dosyalarına yazılmasını: <<=cut mümkün kılar , ayrıntılar için bu örneğe bakın . Bu kullanımı mümkün kılar perldoc script.sh. Bununla birlikte, bu cevapta gösterilen çok satırlı yorum, kesinlikle bir yorum bloğu olması gereken bir şeydir (her satırdan başlayarak # ).
temel6

İşte yorumlarda ve diğer ilginç kullanım durumlarında (dynaimc komut dosyası oluşturma dahil) kullanılan heredocs hakkında güzel bir tartışma: tldp.org/LDP/abs/html/here-docs.html#EX71C
bguiz

28

Herhangi bir yorum tarzı değil. :Yerleşik komut kesinlikle hiçbir şey yapmaz; burada yorum yapmak için suistimal ediliyor.

$ help :
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

25

Erken kabuklarda, kolon, yorum oluşturmanın tek yoluydu.

Ancak, bu doğru bir yorum değildir, çünkü satır diğer komutlarla aynı şekilde ayrıştırılır ve bunun yan etkileri olabilir. Örneğin:

: ${a:=x} # assigns the value 'x' to the variable, 'a'

: $(command) # executes 'command'

(Bazen kolon yalnızca bu yan etkileri çağırmak amacıyla kullanılır, ancak yorum olarak kullanılmaz.)

Bir betiğin bir bölümünü yorumlamak için iki nokta üst üste kullanmak uygun olabilir:

: '
while [ "$n" -ne "$x" ]
do
  : whatever
done
'

Bu #, özellikle yorum yapanların geçici olması durumunda, her satırdan önce gelen büyük bir zaman tasarrufu .


2
Bu tekli alıntı yapma yöntemi, tek bir tırnak işareti kullanan komut dosyasının hiçbir bölümünde çalışmaz. Ve istediğiniz yere yakın bir yerde tırnak kullanıyorsanız, bu, metnin tamamına dağıtan meşru tek tırnaklara sahip olacağınız anlamına gelir. Doğrusal yorumları engellemenizi sağlayan herhangi bir iyi düzenleyiciyi kullanmak çok daha kolaydır.
jw013

Alıntılanan bölümde yalnızca tek bir tırnak olmadığında işe yarayacağına oldukça haklısın. Bununla birlikte, bir komut dosyasının çok fazla tek tırnak işareti olması gerekmez. Senaryolarımın birkaçına bakarken, onları nispeten seyrek buluyorum ve çoğu çift tırnak işareti ile değiştirilebilir.
Chris FA Johnson,

Tekli teklifin veya çiftli teklifin seçimi, betiğinizin metninin kendisinin geçerli bir tek tırnaklı dize olup olmadığına dair kaygısız ve önemsiz bir şeyden etkilenmemelidir. Tek tırnaklar genişlemeleri önlemek için kullanılırken, çift tırnak işaretleri belirli genişlemelere izin verir ve ekstra ayrıştırma gerektirir. Hangisinin kullanılacağının belirlenmesinde asıl kriter budur.
jw013

Bu, bunu yapmanın en şık yoludur. Küçük dokümantasyon blokları için harika. Bundan daha çok hoşlandım /* */ve ugh, başlamama izin verme <!-- -->!
alex grey

1

Yorumunuz betiğin sonundaysa, şu şekilde yapabilirsiniz:

#!/bin/sh
echo 'hello world'
exec true
we can put whatever we want here
\'\"\$\`!#%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
abcdefghijklmnopqrstuvwxyz{|}~
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.