Ubuntu Suomen keskustelualueet

Muut alueet => Yleistä keskustelua => Aiheen aloitti: Postimies - 09.02.16 - klo:22.20

Otsikko: #!/bin/bash
Kirjoitti: Postimies - 09.02.16 - klo:22.20
Onko kukaan miettinyt mistä tuo #! tulee? Kai tuolla joku historiansa on.
Unix ja C ja hankalasti muistettavat asiat jotenkin kuuluvat yhteen.
Otsikko: Vs: #!/bin/bash
Kirjoitti: nm - 09.02.16 - klo:22.41
Tarkka historia on tiedossa: https://en.wikipedia.org/wiki/Shebang_%28Unix%29#History

Keksijänä juurikin C:n ja Unixin isä, Dennis Ritchie (https://en.wikipedia.org/wiki/Dennis_Ritchie).
Otsikko: Vs: #!/bin/bash
Kirjoitti: SuperOscar - 10.02.16 - klo:12.04
En kyllä mitenkään pysty pitämään #!-muotoa hankalasti muistettavana, pikemmin tismalleen päinvastoin!

Verrattuna esimerkiksi OS/2:n vastaavassa tarkoituksessa käytettyyn comspec-merkkijonoon se on ehdottomasti helpompi muistaa ja saada oikein. Lisäksi se on hyvin selvä: #, koska rivi on suorittavan tulkin kannalta kommentti, ! koska nyt suoritetaan jotain. (”!” on joissakin ohjelmissa ollut komento, jolla pudotaan komentotulkkiin, ja yhteys käskyihin on selvä: suomessakin lyhyiden käskylauseiden saa panna ja usein pannaankin huutomerkki.)

Enemmän minua ihmetyttää, miksei risuaitaa valittu myös C-kielen kommenttimerkiksi: sehän oli täysin vapaana. cpp-esiprosessoridirektiivit olisi helposti voitu toteuttaa yhtä aikaa sen kanssa, koska ihmiset yleensä aina panevat välilyönnin kommentin alkumerkin ja tekstin väliin (esim. /* kommentti */ eikä /*kommentti*/). Tai jos lisäturvaa olisi kaivattu, cpp olisi voitu hyvin toteuttaa niin, että # olisi pitänyt vaikka kahdentaa tai jotain.
Otsikko: Vs: #!/bin/bash
Kirjoitti: nm - 10.02.16 - klo:13.13
Enemmän minua ihmetyttää, miksei risuaitaa valittu myös C-kielen kommenttimerkiksi: sehän oli täysin vapaana. cpp-esiprosessoridirektiivit olisi helposti voitu toteuttaa yhtä aikaa sen kanssa, koska ihmiset yleensä aina panevat välilyönnin kommentin alkumerkin ja tekstin väliin (esim. /* kommentti */ eikä /*kommentti*/). Tai jos lisäturvaa olisi kaivattu, cpp olisi voitu hyvin toteuttaa niin, että # olisi pitänyt vaikka kahdentaa tai jotain.

Shell-skriptien kommenttimerkkinä # on uudempaa perua (http://www.in-ulm.de/~mascheck/bourne/) (1979 - 1981) kuin C ja C-esiprosessori, jotka kehitettiin 70-luvulla. C-esiprosessorin ja sen syntaksin varhaishistoriasta en löytänyt ainakaan heti tarkempaa tietoa, mutta ne kuvataan jo K&R:n '78 julkaistussa The C Programming Language -kirjassa (https://archive.org/details/TheCProgrammingLanguageFirstEdition).

Luultavasti Bourne-shellin #-kommenttien mallina oli juuri C-esiprosessoridirektiivit. C-kielen standardeihin rivikommentit puolestaan hyväksyttiin vasta C99:ssä, C++:n mallin mukaan (// kommentti).
Otsikko: Vs: #!/bin/bash
Kirjoitti: SuperOscar - 10.02.16 - klo:13.32
Shell-skriptien kommenttimerkkinä # on uudempaa perua (http://www.in-ulm.de/~mascheck/bourne/) (1979 - 1981) kuin C ja C-esiprosessori, jotka kehitettiin 70-luvulla.

Oho, olisin odottanut päinvastoin, koska # on kommenttimerkkinä myös AWKissa (jossa siinäkin Kernighan oli K-kirjaimena mukana) – ja kas kummaa, Wikipedian mukaan AWK ilmestyi vasta 1977! Olin jotenkin kuvitellut näiden kaikkien syntyneen suunnilleen yhtä aikaa 1970-luvun alkupuolella UNIXin kanssa.

/* on joka tapauksessa kamalan huono kommenttimerkki, kuten tiedetään, etenkin koska / on jakomerkki ja * hakee osoittimen sisällön:

Koodia: [Valitse]
x = y / *z;
Otsikko: Vs: #!/bin/bash
Kirjoitti: Postimies - 10.02.16 - klo:18.52
Shebang oli minulle uusi sana. Shell-skriptien siirrettävyyden kannalta ei ole kovin hyvä asia kun #! jälkeen pitää kirjoittaa koko polku eikä path muuttujan  sisältöä käytetä haussa. Toki bash ja muut tulkit ovat yleensä /bin hakemistossa. #include lienee ollut kauan C:ssä joten # ei käy kommentina. Pascalissa kommentti on (* kommentti *) mikä ehkä selvempi kuin C:ssä. Melko kauas #! historia ulottuu. Ei siis vielä kuollut ja C myös hengissä. Onhan tuossa välissä monta kieltä jo kadonnut käytöstä.
Otsikko: Vs: #!/bin/bash
Kirjoitti: kuutio - 10.02.16 - klo:19.17
Shell-skriptien siirrettävyyden kannalta ei ole kovin hyvä asia kun #! jälkeen pitää kirjoittaa koko polku eikä path muuttujan  sisältöä käytetä haussa.
Jos haluaa, että $PATH muuttuja huomioidaan, voi käyttää shebangina "#!/usr/bin/env NAME", jolloin skripti ajetaan käyttäjän polussa ensimmäisenä olevalla "NAME":lla. Esim. "#!/usr/bin/env bash" tai "#!/usr/bin/env python"
Otsikko: Vs: #!/bin/bash
Kirjoitti: SuperOscar - 10.02.16 - klo:20.36
#include lienee ollut kauan C:ssä joten # ei käy kommentina.

Kuten tuolla yllä totesin, ei esiprosessointi ole mikään este; myös HTML:n SSI-direktiivit toimivat HTML-kommenteista käsin. Säännöksi olisi riittänyt, että kommenteissa #:n ja tekstin välillä pitää olla välilyönti.

Lainaus
Pascalissa kommentti on (* kommentti *) mikä ehkä selvempi kuin C:ssä.

Ja itse asiassa Pascalin alkuperäiset kommenttimerkit olivat { aaltosulkeet }. (* … *) tuli mukaan vasta sitten, kun kansainvälistetyssä 7-bittisessä ASCIIssa { } usein korvattiin muilla merkeillä kuten skandeilla.
Otsikko: Vs: #!/bin/bash
Kirjoitti: nm - 10.02.16 - klo:20.57
Kuten tuolla yllä totesin, ei esiprosessointi ole mikään este; myös HTML:n SSI-direktiivit toimivat HTML-kommenteista käsin. Säännöksi olisi riittänyt, että kommenteissa #:n ja tekstin välillä pitää olla välilyönti.

Tämä olisi kuitenkin muuttanut vakiintunutta käytäntöä, joka mahdollisti sisennykset esiprosessorille tarkoitetussa koodissa:

Koodia: [Valitse]
#ifndef MUUTTUJA
#  define MUUTTUJA 1
#endif

Lainaus
Pascalissa kommentti on (* kommentti *) mikä ehkä selvempi kuin C:ssä.

Ja itse asiassa Pascalin alkuperäiset kommenttimerkit olivat { aaltosulkeet }. (* … *) tuli mukaan vasta sitten, kun kansainvälistetyssä 7-bittisessä ASCIIssa { } usein korvattiin muilla merkeillä kuten skandeilla.

C:ssä mikään sulku ja * -yhdistelmä ei käy kommenttimerkiksi. Kenoviiva \ varmaankin toimisi *:n tai jonkun muun merkin kanssa, ja myös $ olisi vapaa muista merkityksistä.
Otsikko: Vs: #!/bin/bash
Kirjoitti: Postimies - 10.02.16 - klo:23.12

Jos haluaa, että $PATH muuttuja huomioidaan, voi käyttää shebangina "#!/usr/bin/env NAME", jolloin skripti ajetaan käyttäjän polussa ensimmäisenä olevalla "NAME":lla. Esim. "#!/usr/bin/env bash" tai "#!/usr/bin/env python"
Aina oppii jotain uutta. "#!/usr/bin/env python" ajaa siis sen pythonin joka on asennettu esim. käyttäjän /bin hakemistoon (jos polussa), sitten usr/local/bin, /usr/bin, /bin ja lopuksi /opt/bin. Vaihtelee eri systeemeissä. Peleillä joita en harrasta on varmasti vielä omia /bin kansioita.

Otsikko: Vs: #!/bin/bash
Kirjoitti: Postimies - 10.02.16 - klo:23.22

Ja itse asiassa Pascalin alkuperäiset kommenttimerkit olivat { aaltosulkeet }. (* … *) tuli mukaan vasta sitten, kun kansainvälistetyssä 7-bittisessä ASCIIssa { } usein korvattiin muilla merkeillä kuten skandeilla.
Unohtui noi aaltosulkeet. Pascalia olen joskus harrastusmielessä kirjoittanut ja varmaan tuosta syystä ei noita aaltoviivoja tullut käytettyä. Kommenttina esim.
 Å kommentti Ä ei ole paras mahdollinen (en muista mitä niiden sulkujen tilalla oli). Harmi kun vanhoja Borlandin Turbo Pascalilla  tehtyjä ohjelmia ei saa enää ajettua.
Otsikko: Vs: #!/bin/bash
Kirjoitti: SuperOscar - 11.02.16 - klo:00.06
Harmi kun vanhoja Borlandin Turbo Pascalilla  tehtyjä ohjelmia ei saa enää ajettua.

Eikö saa Free Pascalillakaan? Sillähän on kai jopa aika hyvä Delphi-yhteensopivuus. (Ja siitä tuli juuri kolmosversio, ei ole vain vielä tainnut juuri ehtiä minkään distron repoihin.)
Otsikko: Vs: #!/bin/bash
Kirjoitti: Postimies - 11.02.16 - klo:01.59
Harmi kun vanhoja Borlandin Turbo Pascalilla  tehtyjä ohjelmia ei saa enää ajettua.

Eikö saa Free Pascalillakaan? Sillähän on kai jopa aika hyvä Delphi-yhteensopivuus. (Ja siitä tuli juuri kolmosversio, ei ole vain vielä tainnut juuri ehtiä minkään distron repoihin.)
Osan varmasti saa - en ole kokeillut. Borlandin oli kääntäjässä bugi, mikä esti ohjelman ajamisen nopeammassa koneessa. Temppuilemalla sekin onnistuisi. Dossin keskeytykset ja 256-värin VGA näytön grafiikan käsittely pitäisi kyllä kirjoittaa uusiksi. Grafiikkatiloja ja väripaletteja muokkasin ihan konekielen keskeytyksillä. 80-luvun koodia dos-alustalla. Jos CRT ja Graph Unitit suunnilleen yhteensopivia niin voisi onnistua.