Kirjoittaja Aihe: #!/bin/bash  (Luettu 5986 kertaa)

Postimies

  • Käyttäjä
  • Viestejä: 2619
    • Profiili
#!/bin/bash
« : 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.

nm

  • Käyttäjä
  • Viestejä: 16242
    • Profiili
Vs: #!/bin/bash
« Vastaus #1 : 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.
« Viimeksi muokattu: 09.02.16 - klo:22.43 kirjoittanut nm »

SuperOscar

  • Käyttäjä
  • Viestejä: 4000
  • Ocatarinetabellatsumtsum!
    • Profiili
    • Legisign.org
Vs: #!/bin/bash
« Vastaus #2 : 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.
pöytäkone 1, kannettavat 1–3: Debian GNU/Linux 12; pöytäkone 2: openSUSE Tumbleweed; NUC: openSUSE Leap 15.5; RPi 1: FreeBSD 13.2-RELEASE; RPi 2: LibreELEC 11

nm

  • Käyttäjä
  • Viestejä: 16242
    • Profiili
Vs: #!/bin/bash
« Vastaus #3 : 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 (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.

Luultavasti Bourne-shellin #-kommenttien mallina oli juuri C-esiprosessoridirektiivit. C-kielen standardeihin rivikommentit puolestaan hyväksyttiin vasta C99:ssä, C++:n mallin mukaan (// kommentti).
« Viimeksi muokattu: 10.02.16 - klo:13.22 kirjoittanut nm »

SuperOscar

  • Käyttäjä
  • Viestejä: 4000
  • Ocatarinetabellatsumtsum!
    • Profiili
    • Legisign.org
Vs: #!/bin/bash
« Vastaus #4 : 10.02.16 - klo:13.32 »
Shell-skriptien kommenttimerkkinä # on uudempaa perua (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;
pöytäkone 1, kannettavat 1–3: Debian GNU/Linux 12; pöytäkone 2: openSUSE Tumbleweed; NUC: openSUSE Leap 15.5; RPi 1: FreeBSD 13.2-RELEASE; RPi 2: LibreELEC 11

Postimies

  • Käyttäjä
  • Viestejä: 2619
    • Profiili
Vs: #!/bin/bash
« Vastaus #5 : 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ä.

kuutio

  • Käyttäjä
  • Viestejä: 160
    • Profiili
Vs: #!/bin/bash
« Vastaus #6 : 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"

SuperOscar

  • Käyttäjä
  • Viestejä: 4000
  • Ocatarinetabellatsumtsum!
    • Profiili
    • Legisign.org
Vs: #!/bin/bash
« Vastaus #7 : 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.
pöytäkone 1, kannettavat 1–3: Debian GNU/Linux 12; pöytäkone 2: openSUSE Tumbleweed; NUC: openSUSE Leap 15.5; RPi 1: FreeBSD 13.2-RELEASE; RPi 2: LibreELEC 11

nm

  • Käyttäjä
  • Viestejä: 16242
    • Profiili
Vs: #!/bin/bash
« Vastaus #8 : 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ä.
« Viimeksi muokattu: 10.02.16 - klo:21.00 kirjoittanut nm »

Postimies

  • Käyttäjä
  • Viestejä: 2619
    • Profiili
Vs: #!/bin/bash
« Vastaus #9 : 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.


Postimies

  • Käyttäjä
  • Viestejä: 2619
    • Profiili
Vs: #!/bin/bash
« Vastaus #10 : 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.

SuperOscar

  • Käyttäjä
  • Viestejä: 4000
  • Ocatarinetabellatsumtsum!
    • Profiili
    • Legisign.org
Vs: #!/bin/bash
« Vastaus #11 : 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.)
pöytäkone 1, kannettavat 1–3: Debian GNU/Linux 12; pöytäkone 2: openSUSE Tumbleweed; NUC: openSUSE Leap 15.5; RPi 1: FreeBSD 13.2-RELEASE; RPi 2: LibreELEC 11

Postimies

  • Käyttäjä
  • Viestejä: 2619
    • Profiili
Vs: #!/bin/bash
« Vastaus #12 : 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.