Ohjelman sijaintiEdit
Shebangien on määritettävä absoluuttiset polut (tai polut suhteessa nykyiseen työhakemistoon) järjestelmän suoritettaviin tiedostoihin; tämä voi aiheuttaa ongelmia järjestelmissä, joissa on epätyypillinen tiedostojärjestelmän asettelu. Vaikka järjestelmissä olisikin melko vakioidut polut, on täysin mahdollista, että saman käyttöjärjestelmän eri versioilla on eri sijainnit halutulle tulkintaohjelmalle. Esimerkiksi Python saattaa olla osoitteessa /usr/bin/python3, /usr/local/bin/python3 tai jopa jossain /home/käyttäjätunnus/bin/python3, jos sen on asentanut tavallinen käyttäjä.
Yhtäläinen ongelma on olemassa POSIX-ulkosuorittimelle, koska POSIX vaati vain, että sen nimi on sh, mutta ei määrännyt polkua. Yleinen arvo on /bin/sh, mutta joissakin järjestelmissä, kuten Solariksessa, POSIX-yhteensopiva komentotulkki on osoitteessa /usr/xpg4/bin/sh. Monissa Linux-järjestelmissä /bin/sh on kova tai symbolinen linkki /bin/bash:iin, Bourne Again -selaimeen (BASH). Bash-kohtaisen syntaksin käyttäminen samalla kun säilytetään sh:hen osoittava shebang ei myöskään ole siirrettävissä.
Tästä syystä shebang-riviä joudutaan joskus muokkaamaan sen jälkeen, kun skripti on kopioitu tietokoneelta toiselle, koska skriptiin koodattu polku ei välttämättä päde uudella koneella, riippuen tulkitsijan sijoittelun aiempien konventioiden johdonmukaisuudesta. Tästä syystä ja koska POSIX ei standardoi polkujen nimiä, POSIX ei standardoi tätä ominaisuutta. GNU Autoconf -työkalu voi testata järjestelmätuen makrolla AC_SYS_INTERPRETER.
Usein ohjelmaa /usr/bin/env voidaan käyttää tämän rajoituksen kiertämiseen ottamalla käyttöön indirektiotaso. #!
seuraa /usr/bin/env, jota seuraa haluttu komento ilman täyttä polkua, kuten tässä esimerkissä:
#!/usr/bin/env sh
Tämä toimii useimmiten siksi, että polkua /usr/bin/env käytetään yleisesti env-apuohjelmaan,ja se kutsuu ensimmäisenä käyttäjän $PATH:sta löytyvän sh:n, tyypillisesti /bin/sh.
Tässä on silti joitakin siirrettävyysongelmia OpenServer 5.0.6:n ja Unicos 9.0.2:n kanssa, joissa on vain /bin/env eikä /usr/bin/env.
Merkkien tulkintaEdit
Toinen siirrettävyysongelma on komentoargumenttien tulkinta.Jotkin järjestelmät, Linux mukaan lukien, eivät jaa argumentteja; esimerkiksi ajettaessa komentosarjaa ensimmäisellä rivillä kuten,
#!/usr/bin/env python3 -c
kaikkea ensimmäisen välilyönnin jälkeistä tekstiä käsitellään yhtenä argumenttina, eli python3 -c
välitetään yhtenä argumenttina komentosarjaan /usr/bin/env kahden argumentin sijasta. Myös Cygwin käyttäytyy näin.
Kompleksiset tulkkikutsut ovat mahdollisia käyttämällä ylimääräistä wrapperiä. FreeBSD 6.0 (2005) otti käyttöön -S-option env:ssä, kun se muutti shebang-lukukäyttäytymisen jakamattomaksi. Tämä optio käskee env:tä jakamaan merkkijonon itse. GNU env -apuohjelma vuodesta coreutil 8.30 (2018) lähtien sisältää myös tämän ominaisuuden. Vaikka tämän vaihtoehdon käyttäminen lieventää jakamiseen liittyvää siirrettävyysongelmaa ytimen puolella, se lisää vaatimuksen, että env tukee tätä tiettyä laajennusta.
Toinen ongelma ovat skriptit, jotka sisältävät carriage return -merkin heti shebang-rivin jälkeen, ehkä siksi, että niitä on muokattu järjestelmässä, joka käyttää DOS-rivinvaihtoa, kuten Microsoft Windows. Jotkin järjestelmät tulkitsevat carriage return -merkin osaksi tulkin komentoa, mikä johtaa virheilmoitukseen.
TaikalukuMuokkaa
Shebang-merkki on itse asiassa ihmiselle luettavissa oleva esiintymä taikaluvusta suoritettavassa tiedostossa, ja taikaluvun merkkijono (magic byte string) on 0x23 0x21, joka on ASCII:ssä kaksimerkkinen koodausmerkki #!. Tämän maagisen numeron tunnistaa ”exec”-funktioperhe, joka määrittää, onko tiedosto skripti vai suoritettava binääritiedosto. Shebangin läsnäolo johtaa määritellyn suoritettavan tiedoston, yleensä skriptin kielen tulkin, suorittamiseen. On väitetty, että jotkut vanhat Unix-versiot odottavat, että normaalin shebangin jälkeen tulee välilyönti ja vinoviiva (#! /
), mutta tämä ei näytä pitävän paikkaansa; pikemminkin shebangin jälkeen on perinteisesti sallittu välilyönti, ja joskus se on dokumentoitu välilyönnin kanssa (ks. vuoden 1980 sähköpostiviesti historiaa käsittelevässä osiossa jäljempänä).
Shebang-merkit esitetään samoilla kahdella tavulla laajennetuissa ASCII-koodauksissa, mukaan lukien UTF-8, jota käytetään yleisesti skripteissä ja muissa tekstitiedostoissa nykyisissä Unixin kaltaisissa järjestelmissä. UTF-8-tiedostot voivat kuitenkin alkaa valinnaisella tavujärjestysmerkillä (byte order mark, BOM); jos ”exec”-funktio havaitsee erityisesti tavut 0x23 ja 0x21, BOM-merkki (0xEF 0xBB 0xBF) ennen shebang-merkkiä estää skriptitulkin suorittamisen. Jotkut viranomaiset suosittelevat, ettei tavujärjestysmerkkiä käytettäisi POSIX-skripteissä (Unixin kaltaisissa skripteissä) tästä syystä ja laajempien yhteentoimivuus- ja filosofisten huolenaiheiden vuoksi. Lisäksi tavujärjestysmerkki ei ole välttämätön UTF-8-koodauksessa, koska tässä koodauksessa ei ole endianness-ongelmia; sen tarkoituksena on vain tunnistaa koodaus UTF-8:ksi.