Moniriviset komentosarjakommentit – miten tämä toimii?

Viime aikoina törmäsin moniriviseen kommenttityyppiin, jota en ole koskaan ennen nähnyt – tässä on komentosarjaesimerkki:

echo a # : aaa : ddd # echo b 

Tämä näyttää toimivan, jopa vim syntaksi korostaa sen. Miksi tätä kommentointityyliä kutsutaan ja miten löydän siitä lisätietoja?

Kommentit

  • Entä jos kiedot koodisi funktioksi kommentoida sitä? CommentedOutBlock() { echo "test"; }
  • Kuten muut ovat jo maininneet, moniriviset kommentit eivät ole käytettävissä natiivisti. Joten käytän jos väärä; sitten < kuinka monta ikinä haluat riviä > fi

Vastaa

Se ei ole monirivinen kommentti. # on yhden rivin kommentti. : (kaksoispiste) ei ole lainkaan kommentti, vaan pikemminkin komentotulkin sisäinen komento, joka on NOP , nollaoperaatio, joka ei tee muuta kuin palauttaa arvon true, kuten true (ja siten asettaa $? – 0 sivuvaikutuksena). Koska kyseessä on komento, se voi kuitenkin hyväksyä argumentit ja koska se jättää huomioimatta argumentit, useimmissa tapauksissa se toimii pinnallisesti kuin kommentti. Tämän kludgen pääongelma on, että argumentteja laajennetaan edelleen, mikä johtaa lukuisiin tahattomiin seurauksiin. Syntaksivirheet vaikuttavat edelleen argumentteihin, uudelleenohjaukset suoritetaan edelleen, joten : > file katkaisee file ja : $(dangerous command) korvaukset jatkuvat edelleen.

Vähiten yllättävä, täysin turvallinen tapa lisätä kommentteja komentosarjakomentoihin on #. Pysy siinä jopa monirivisiä kommentteja varten. Älä koskaan yritä (ab) käyttää : kommentteihin. Kuoressa ei ole omistettua monirivistä kommentointimekanismia, joka olisi analoginen kauttaviiva-tähti /* */ -muodon kanssa C -tyyppisillä kielillä.


Täydellisyyden vuoksi, mutta ei siksi, että se on suositeltavaa, mainitsen, että on mahdollista käyttää täällä-asiakirjoja tehdä monirivisiä ”kommentteja”:

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

Kommentit

  • +1 erittäin tärkeitä pidä yksittäiset lainausmerkit rivillä << – tämä poistaa käytöstä korvaamisen ja laajentamisen.
  • Ja lisähuomautuksena täyttämällä komentosarjat komentosarjalla : aiheille, joiden pitäisi olla kommentteja, aiheutuu ylimääräistä RAM / CPU-kulutusta. Se voitti ’ t mater yksinkertaisia asioita työpöydällesi, mutta jos se ’ s jotain suoritettiin satoja tai tuhansia kertoja sekunnissa sinä ’ ll älä tee mitään, mahtavaa nopeasti .
  • @bahamat: jos suoritat jotain satoja tai tuhansia kertoja sekunnissa, toivottavasti voitit ’ t kirjoittamatta sen kuoreen … = /
  • Joskus käyttämällä null-apuohjelmaa useille riveille teksti voi olla hyödyllinen. Kommentin aloittaminen : <<=cut -ominaisuudella antaa mahdollisuuden kirjoittaa POD shell-komentosarjoihin, katso lisätietoja tästä esimerkistä . Tämä tekee mahdolliseksi käyttää perldoc script.sh. Tässä vastauksessa esitetty monirivinen kommentti on kuitenkin jotain, jonka tulisi ehdottomasti olla kommenttilohko (kukin rivi alkaa # ).
  • Tässä ’ hyvä keskustelu heredocsista, jota käytetään sekä kommenteissa että muissa mielenkiintoisissa käyttötapauksissa (myös dynaimc-komentosarjojen luonti): tldp.org/LDP/ abs / html / here-docs.html # EX71C

Vastaa

Se ei ole mikä tahansa kommentointityyli. sisäänrakennettu komento : ei tee mitään; sitä väärinkäytetään kommentoinnin yhteydessä.

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

Vastaus

Varhaisissa kuorissa kaksoispiste oli ainoa tapa luoda kommentteja.

Se ei kuitenkaan ole tosi kommentti, koska rivi jäsennetään täsmälleen samalla tavalla kuin mikä tahansa muu komento jäsennetään, ja sillä voi olla sivuvaikutuksia. Esimerkki:

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

(Joskus kaksoispistettä käytetään vain näiden sivuvaikutusten kutsumiseen, mutta sitä ei sitten käytetä kommenttina.)

Joskus on kätevää käyttää kaksoispistettä kommentoidaksesi komentosarjan osaa:

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

Tämä on hieno aikaa säästävä jokaisen edelliseen rivillä #, varsinkin jos kommentointi on vain väliaikaista.

Kommentit

  • Tämä yksittäinen lainauskommentointimenetelmä ei toimi ’ ei missään komentosarjan osassa, joka itse käyttää lainausmerkkejä.Ja jos käytät lainauksia missä tahansa niin lähellä kuin sinun pitäisi, se tarkoittaa, että ’ sinulla on laillisia yksittäisiä lainausmerkkejä siroteltuina kaikkialle komentosarjaan. On niin paljon yksinkertaisempaa käyttää vain mitä tahansa kunnollista muokkausohjelmaa, jonka avulla voit estää rivikommentit.
  • Olet aivan oikeassa, että se toimii vain, jos lainatussa osiossa ei ole yksittäisiä lainausmerkkejä. Komentosarjassa ei kuitenkaan tarvitse olla paljon yksittäisiä lainauksia. Tarkastellessani muutamia käsikirjoituksiani minusta ne ovat suhteellisen harvinaisia, ja monet niistä voidaan korvata lainausmerkeillä.
  • Yksittäisen tai kaksoislainauksen valintaan ei tuskin pitäisi vaikuttaa jotain niin triviaalia ja merkityksetöntä a huoli siitä, onko komentosarjan teksti itsessään kelvollinen yhden lainauksen merkkijono. Yksittäisiä lainausmerkkejä käytetään estämään laajennuksia, kun taas kaksoislainausmerkit mahdollistavat tietyt laajennukset ja edellyttävät ylimääräistä jäsentämistä. Tämä on todellinen kriteeri sen määrittämiseksi, mitä käyttää.
  • Tämä on ylivoimaisesti tyylikkäin tapa tehdä se. Erinomainen pienille dokumentaatiolohkoille. Pidän siitä paremmin kuin /* */ ja ugh, Don ’ älä aloita minua <!-- --> !

Vastaa

Jos kommenttisi on komentosarjan lopussa, voit tehdä sen näin:

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

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *