ProgramplaceringRediger
Shebang’er skal angive absolutte stier (eller stier relative til den aktuelle arbejdskatalog) til systemeksekverbare filer; dette kan give problemer på systemer, der har et ikke-standardiseret filsystemlayout. Selv når systemer har ret standardiserede stier, er det meget muligt for varianter af det samme operativsystem at have forskellige placeringer for den ønskede fortolker. Python kan f.eks. ligge i /usr/bin/python3, /usr/local/bin/python3, eller endda noget som /home/username/bin/python3, hvis det er installeret af en almindelig bruger.
Et lignende problem eksisterer for POSIX-shellen, da POSIX kun krævede, at dens navn skulle være sh, men ikke foreskrev en sti. En almindelig værdi er /bin/sh, men nogle systemer, såsom Solaris, har den POSIX-kompatible shell på /usr/xpg4/bin/sh. I mange Linux-systemer er /bin/sh et hårdt eller symbolsk link til /bin/bash, Bourne Again-shell’en (BASH). At bruge bash-specifik syntaks, mens man opretholder en shebang, der peger på sh, er heller ikke transportabel.
På grund af dette er det nogle gange nødvendigt at redigere shebang-linjen efter kopiering af et script fra en computer til en anden, fordi den sti, der var kodet ind i scriptet, måske ikke gælder på en ny maskine, afhængigt af konsistensen i tidligere konventioner for placering af fortolkeren. Af denne grund, og fordi POSIX ikke standardiserer stinavne, standardiserer POSIX ikke denne funktion. GNU Autoconf-værktøjet kan teste for systemunderstøttelse med makroen AC_SYS_INTERPRETER.
Ofte kan programmet /usr/bin/env bruges til at omgå denne begrænsning ved at introducere et indirekte niveau. #!
efterfølges af /usr/bin/env, efterfulgt af den ønskede kommando uden fuld sti, som i dette eksempel:
Dette virker for det meste, fordi stien /usr/bin/env almindeligvis bruges til env-hjælpeprogrammet,og det påkalder den første sh, der findes i brugerens $PATH, typisk /bin/sh.
Dette har stadig nogle portabilitetsproblemer med OpenServer 5.0.6 og Unicos 9.0.2, som kun har /bin/env og ikke /usr/bin/env.
TegnfortolkningRediger
Et andet portabilitetsproblem er fortolkningen af kommandoargumenterne. nogle systemer, herunder Linux, opdeler ikke argumenterne; for eksempel, når scriptet køres med den første linje som,
#!/usr/bin/env python3 -c
, behandles al tekst efter det første mellemrum som et enkelt argument, dvs. python3 -c
vil blive overført som ét argument til /usr/bin/env, i stedet for to argumenter. Cygwin opfører sig også på denne måde.
Komplekse fortolkerinvitationer er mulige ved brug af en ekstra wrapper. FreeBSD 6.0 (2005) introducerede en -S indstilling til sin env, da den ændrede shebang-læsningsadfærden til ikke-splitning. Denne indstilling fortæller env, at den selv skal splitte strengen. GNU env-værktøjet siden coreutil 8.30 (2018) indeholder også denne funktion. Selv om brugen af denne indstilling afhjælper portabilitetsproblemet i kernenden med opsplitning, tilføjer den et krav om, at env understøtter denne særlige udvidelse.
Et andet problem er scripts, der indeholder et vognrumstegn umiddelbart efter shebang-linjen, måske som følge af, at de er redigeret på et system, der bruger DOS-linjeskift, som f.eks. Microsoft Windows. Nogle systemer fortolker vogn returtegnet som en del af fortolkerkommandoen, hvilket resulterer i en fejlmeddelelse.
Magisk nummerRediger
Shebang er faktisk en menneskeligt læsbar forekomst af et magisk nummer i den eksekverbare fil, idet den magiske byte-streng er 0x23 0x21, den to-tegns kodning i ASCII af #!. Dette magiske nummer opdages af “exec”-familien af funktioner, som afgør, om en fil er et script eller en eksekverbar binær fil. Tilstedeværelsen af shebang vil resultere i eksekvering af den angivne eksekverbare fil, normalt en fortolker for scriptets sprog. Det er blevet hævdet, at nogle gamle versioner af Unix forventer, at det normale shebang skal efterfølges af et mellemrum og en skråstreg (#! /
), men dette lader ikke til at være sandt; derimod har det traditionelt været tilladt med blanktegn efter shebang, og nogle gange er det dokumenteret med et mellemrum (se e-mailen fra 1980 i afsnittet om historie nedenfor).
Shebang-tegnene repræsenteres af de samme to bytes i udvidede ASCII-kodninger, herunder UTF-8, som almindeligvis anvendes til scripts og andre tekstfiler på nuværende Unix-lignende systemer. UTF-8-filer kan dog begynde med det valgfrie byteordningsmærke (BOM); hvis “exec”-funktionen specifikt registrerer bytes 0x23 og 0x21, vil tilstedeværelsen af BOM (0xEF 0xBB 0xBF) før shebang forhindre scriptfortolkeren i at blive eksekveret. Nogle autoriteter anbefaler, at man ikke bruger byteordningsmærket i POSIX (Unix-lignende) scripts af denne grund og af bredere interoperabilitets- og filosofiske hensyn. Desuden er et byteordningsmærke ikke nødvendigt i UTF-8, da denne kodning ikke har problemer med endianness; det tjener kun til at identificere kodningen som UTF-8.