Comentarii script multiliniu – cum funcționează acest lucru?

Recent, am dat peste un tip de comentariu pe mai multe linii pe care nu l-am mai văzut până acum – iată un exemplu de script:

echo a # : aaa : ddd # echo b 

Acest lucru pare să funcționeze, chiar vim sintaxă o evidențiază. Cum se numește acest stil de comentare și cum pot găsi mai multe informații despre acesta?

Comentarii

  • Ce se întâmplă dacă în loc să înfășurați codul în funcție la o comentezi? CommentedOutBlock() { echo "test"; }
  • După cum au menționat alții deja, comentariile pe mai multe linii nu sunt disponibile în mod nativ. Deci folosesc dacă este fals; apoi < câte linii vreți > fi

Răspundeți

Acesta nu este un comentariu pe mai multe linii. # este un comentariu cu o singură linie. : (colon) nu este deloc un comentariu, ci mai degrabă o comandă încorporată în shell care este practic o NOP , o operație nulă care nu face altceva decât să returneze adevărat, cum ar fi true (și astfel setarea $? la 0 ca efect secundar). Cu toate acestea, deoarece este o comandă, poate accepta argumente și, deoarece își ignoră argumentele, în majoritatea cazurilor acționează superficial ca un comentariu. Principala problemă cu acest zbat este că argumentele sunt încă extinse, ducând la o serie de consecințe neintenționate. Argumentele sunt încă afectate de erori de sintaxă, redirecționările sunt încă efectuate, astfel încât : > file va trunchia file și : $(dangerous command) substituțiile vor rula în continuare.

Cel mai puțin surprinzător mod complet sigur de a insera comentarii în scripturile shell este cu #. Respectați asta chiar și pentru comentariile pe mai multe linii. Niciodată nu încercați să (ab) utilizați : pentru comentarii. Nu există un mecanism dedicat de comentarii multi-linie în shell care să fie similar cu forma slash-star /* */ în limbile asemănătoare C.


Din motive de completitudine, dar nu pentru că este o practică recomandată, voi menționa că este posibil să utilizați here-documents să faci „comentarii” pe mai multe linii:

: <<"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 

Comentarii

  • +1 foarte important pentru păstrați ghilimelele simple pe linia << – care dezactivează substituirea și extinderea.
  • Și ca o notă suplimentară, completarea scripturilor shell cu : pentru lucrurile care ar trebui să fie comentarii vor provoca un consum suplimentar de RAM / CPU. A câștigat ' t mater pentru lucruri simple de pe desktop, dar dacă ' este ceva executat de sute sau mii de ori pe secundă ' voi să nu fac nimic, foarte repede .
  • @bahamat: dacă executați ceva sute sau de mii de ori pe secundă, sper că ați câștigat ' t-l scrieți în shell … = /
  • Uneori, folosind utilitarul nul pentru mai multe linii de textul poate fi util. Începerea comentariului cu : <<=cut face posibilă scrierea POD în scripturile shell, consultați acest exemplu pentru detalii . Acest lucru face posibilă utilizarea perldoc script.sh. Cu toate acestea, comentariul cu mai multe linii prezentat în acest răspuns este ceva care ar trebui să fie cu siguranță un bloc de comentarii (fiecare linie care începe cu # ).
  • Aici ' o discuție frumoasă despre heredocs, folosită atât pentru comentarii, cât și pentru alte cazuri de utilizare interesante (inclusiv inclusiv generarea de scripturi dynaimc): tldp.org/LDP/ abs / html / here-docs.html # EX71C

Răspuns

Nu este orice stil de comentare. : comanda încorporată nu face absolut nimic; este abuzată pentru comentarii aici.

$ help : :: : Null command. No effect; the command does nothing. Exit Status: Always succeeds. 

Răspuns

În primele shell-uri, colonul era singura modalitate de a crea comentarii.

Cu toate acestea, nu este un comentariu adevărat, deoarece linia este analizată exact în același mod în care este analizată orice altă comandă și poate avea efecte secundare. De exemplu:

: ${a:=x} # assigns the value "x" to the variable, "a" : $(command) # executes "command" 

(Uneori, colonul este utilizat numai în scopul invocării acelor efecte secundare, dar apoi nu este folosit ca un comentariu.)

Uneori este convenabil să folosiți două puncte pentru a comenta o secțiune dintr-un script:

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

Acesta este un economisire de timp excelent față de fiecare linie cu #, mai ales dacă comentariile sunt doar temporare.

Comentarii

  • metoda de comentare a citatelor nu funcționează pe ' pe nicio secțiune din script care folosește ea însăși ghilimele.Și dacă folosiți ghilimele aproape de cât ar trebui, înseamnă că ' veți avea ghilimele unice legitime presărate pe tot scriptul. Este mult mai simplu să folosiți orice editor decent care vă permite să blocați comentarii pe linie.
  • Aveți dreptate că va funcționa numai dacă nu există ghilimele în secțiunea citată. Cu toate acestea, un script nu trebuie să aibă multe ghilimele unice. Privind câteva dintre scenariile mele, le găsesc relativ rare și multe ar putea fi înlocuite cu ghilimele duble.
  • Alegerea ghilimelelor simple sau ghilimele duble nu ar trebui să fie influențată de ceva atât de banal și irelevant. vă îngrijorează dacă textul scriptului dvs. este el însuși un șir valid validat. Ghilimelele unice sunt utilizate pentru a preveni expansiunile, în timp ce ghilimelele duble permit anumite extinderi și necesită o analiză suplimentară. Acesta este criteriul real pentru a determina care să se utilizeze.
  • Acesta este de departe cel mai elegant mod de a face acest lucru. Excelent pentru blocuri mici de documentare. Îmi place mai bine decât /* */ și ugh, nu ' mă face să încep pe <!-- --> !

Răspuns

Dacă comentariul dvs. se află la sfârșitul scriptului, îl puteți face astfel:

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

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *