Posizione del programmaEdit
Gli shebang devono specificare percorsi assoluti (o relativi alla directory di lavoro corrente) agli eseguibili di sistema; questo può causare problemi su sistemi che hanno una disposizione non standard del file system. Anche quando i sistemi hanno percorsi abbastanza standard, è abbastanza possibile che le varianti dello stesso sistema operativo abbiano posizioni diverse per l’interprete desiderato. Python, per esempio, potrebbe essere in /usr/bin/python3, /usr/local/bin/python3, o anche qualcosa come /home/username/bin/python3 se installato da un utente normale.
Un problema simile esiste per la shell POSIX, poiché POSIX richiedeva solo che il suo nome fosse sh, ma non imponeva un percorso. Un valore comune è /bin/sh, ma alcuni sistemi come Solaris hanno la shell POSIX-compatibile in /usr/xpg4/bin/sh. In molti sistemi Linux, /bin/sh è un collegamento rigido o simbolico a /bin/bash, la shell Bourne Again (BASH). Usare la sintassi specifica di bash mantenendo uno shebang che punta a sh non è anche portabile.
A causa di questo a volte è necessario modificare la linea shebang dopo aver copiato uno script da un computer all’altro perché il percorso che è stato codificato nello script potrebbe non applicarsi su una nuova macchina, a seconda della coerenza nella convenzione passata di posizionamento dell’interprete. Per questo motivo e perché POSIX non standardizza i nomi dei percorsi, POSIX non standardizza la funzione. Lo strumento GNU Autoconf può testare il supporto del sistema con la macro AC_SYS_INTERPRETER.
Spesso, il programma /usr/bin/env può essere usato per aggirare questa limitazione introducendo un livello di indirezione. #!
è seguito da /usr/bin/env, seguito dal comando desiderato senza percorso completo, come in questo esempio:
#!/usr/bin/env sh
Questo funziona per lo più perché il percorso /usr/bin/env è comunemente usato per l’utilità env, e invoca il primo sh trovato nella $PATH dell’utente, tipicamente /bin/sh.
Questo ha ancora alcuni problemi di portabilità con OpenServer 5.0.6 e Unicos 9.0.2 che hanno solo /bin/env e nessun /usr/bin/env.
Interpretazione dei caratteriModifica
Un altro problema di portabilità è l’interpretazione degli argomenti del comando.Alcuni sistemi, incluso Linux, non dividono gli argomenti; per esempio, quando si esegue lo script con la prima linea come,
#!/usr/bin/env python3 -c
tutto il testo dopo il primo spazio viene trattato come un unico argomento, cioè python3 -c
verrà passato come un unico argomento a /usr/bin/env, piuttosto che due argomenti. Anche Cygwin si comporta in questo modo.
Invocazioni complesse dell’interprete sono possibili attraverso l’uso di un wrapper aggiuntivo. FreeBSD 6.0 (2005) ha introdotto un’opzione -S al suo env quando ha cambiato il comportamento della lettura di shebang in non-splitting. Questa opzione dice a env di dividere la stringa stessa. L’utilità GNU env da coreutil 8.30 (2018) include anche questa caratteristica. Sebbene l’uso di questa opzione mitighi il problema di portabilità del kernel con lo splitting, aggiunge il requisito che env supporti questa particolare estensione.
Un altro problema sono gli script che contengono un carattere di ritorno a capo subito dopo la linea shebang, forse come risultato dell’essere stati modificati su un sistema che usa le interruzioni di riga DOS, come Microsoft Windows. Alcuni sistemi interpretano il carattere di ritorno a capo come parte del comando dell’interprete, causando un messaggio di errore.
Magic numberEdit
Lo shebang è in realtà un’istanza leggibile dall’uomo di un numero magico nel file eseguibile, la stringa di byte magico è 0x23 0x21, la codifica a due caratteri in ASCII di #! Questo numero magico è rilevato dalla famiglia di funzioni “exec”, che determinano se un file è uno script o un binario eseguibile. La presenza dello shebang porterà all’esecuzione dell’eseguibile specificato, di solito un interprete per il linguaggio dello script. È stato affermato che alcune vecchie versioni di Unix si aspettano che lo shebang normale sia seguito da uno spazio e da una barra (#! /
), ma questo sembra essere falso; piuttosto, gli spazi vuoti dopo lo shebang sono stati tradizionalmente permessi, e talvolta documentati con uno spazio (vedi l’e-mail del 1980 nella sezione storia qui sotto).
I caratteri shebang sono rappresentati dagli stessi due byte nelle codifiche ASCII estese, incluso UTF-8, che è comunemente usato per script e altri file di testo sugli attuali sistemi Unix-like. Tuttavia, i file UTF-8 possono iniziare con il byte order mark (BOM) opzionale; se la funzione “exec” rileva specificamente i byte 0x23 e 0x21, allora la presenza del BOM (0xEF 0xBB 0xBF) prima dello shebang impedirà l’esecuzione dell’interprete dello script. Alcune autorità raccomandano di non usare il byte order mark negli script POSIX (Unix-like), per questa ragione e per preoccupazioni filosofiche e di interoperabilità più ampie. Inoltre, un marcatore di ordine di byte non è necessario in UTF-8, poiché quella codifica non ha problemi di endianness; serve solo per identificare la codifica come UTF-8.