Su Linux, lo shebang non è molto flessibile; in base a risposte multiple ( la risposta di Stephen Kitt e di Jörg W Mittag ), non esiste un modo designato per passare più argomenti in una riga shebang.
Non sono sicuro che sarà utile a nessuno, ma ho scritto un breve script per implementare la funzione mancante. Vedi https://gist.github.com/loxaxs/7cbe84aed1c38cf18f70d8427bed1efa .
È anche possibile scrivere soluzioni alternative incorporate. Sotto, vi presento quattro soluzioni alternative agnostiche applicate allo stesso script di test e il risultato viene stampato. Suppongo che lo script sia eseguibile e sia presente /tmp/shebang
.
Avvolgendo la tua sceneggiatura in una eredità bash all'interno della sostituzione del processo
Per quanto ne so, questo è il modo più affidabile di agnostico linguaggio per farlo. Permette il passaggio di argomenti e conserva lo stdin. Lo svantaggio è che l'interprete non conosce la posizione (reale) del file che legge.
#!/bin/bash
exec python3 -O <(cat << 'EOWRAPPER'
print("PYTHON_SCRIPT_BEGINNING")
from sys import argv
try:
print("input() 0 ::", input())
print("input() 1 ::", input())
except EOFError:
print("input() caused EOFError")
print("argv[0] ::", argv[0])
print("argv[1:] ::", argv[1:])
print("__debug__ ::", __debug__)
# The -O option changes __debug__ to False
print("PYTHON_SCRIPT_END")
EOWRAPPER
) "$@"
Chiamata di echo -e 'aa\nbb' | /tmp/shebang 'arg1' 'arg2 contains spaces' 'arg3\ uses\ \\escapes\\'
stampe:
PYTHON_SCRIPT_BEGINNING
input() 0 :: aa
input() 1 :: bb
argv[0] :: /dev/fd/62
argv[1:] :: ['arg1', 'arg2 contains spaces', 'arg3\\ uses\\ \\\\escapes\\\\']
__debug__ :: False
PYTHON_SCRIPT_END
Si noti che la sostituzione del processo produce un file speciale. Questo potrebbe non essere adatto a tutti gli eseguibili. Ad esempio, si #!/usr/bin/less
lamenta:/dev/fd/63 is not a regular file (use -f to see it)
Non so se è possibile avere ereditarietà nella sostituzione del processo in dash.
Avvolgendo la tua sceneggiatura in una semplice eredità
Più breve e più semplice, ma non sarai in grado di accedere stdin
dal tuo script e richiede che l'interprete sia in grado di leggere ed eseguire uno script da stdin
.
#!/bin/sh
exec python3 - "$@" << 'EOWRAPPER'
print("PYTHON_SCRIPT_BEGINNING")
from sys import argv
try:
print("input() 0 ::", input())
print("input() 1 ::", input())
except EOFError:
print("input() caused EOFError")
print("argv[0] ::", argv[0])
print("argv[1:] ::", argv[1:])
print("__debug__ ::", __debug__)
# The -O option changes __debug__ to False
print("PYTHON_SCRIPT_END")
EOWRAPPER
Chiamata di echo -e 'aa\nbb' | /tmp/shebang 'arg1' 'arg2 contains spaces' 'arg3\ uses\ \\escapes\\'
stampe:
PYTHON_SCRIPT_BEGINNING
input() caused EOFError
argv[0] :: -
argv[1:] :: ['arg1', 'arg2 contains spaces', 'arg3\\ uses\\ \\\\escapes\\\\']
__debug__ :: True
PYTHON_SCRIPT_END
Usa la system()
chiamata awk ma senza argomenti
Passa correttamente il nome del file eseguito, ma lo script non riceverà gli argomenti forniti. Nota che awk è l'unica lingua che conosco il cui interprete è installato su Linux per impostazione predefinita e legge le istruzioni dalla riga di comando per impostazione predefinita.
#!/usr/bin/gawk BEGIN {system("python3 -O " ARGV[1])}
print("PYTHON_SCRIPT_BEGINNING")
from sys import argv
print("input() 0 ::", input())
print("input() 1 ::", input())
print("argv[0] ::", argv[0])
print("argv[1:] ::", argv[1:])
print("__debug__ ::", __debug__)
# The -O option changes __debug__ to False
print("PYTHON_SCRIPT_END")
Chiamata di echo -e 'aa\nbb' | /tmp/shebang 'arg1' 'arg2 contains spaces' 'arg3\ uses\ \\escapes\\'
stampe:
PYTHON_SCRIPT_BEGINNING
input() 0 :: aa
input() 1 :: bb
argv[0] :: /tmp/shebang
argv[1:] :: []
__debug__ :: False
PYTHON_SCRIPT_END
Usa la system()
chiamata awk 4.1+ , a condizione che i tuoi argomenti non contengano spazi
Bello, ma solo se sei sicuro che il tuo script non verrà chiamato con argomenti contenenti spazi. Come puoi vedere, i tuoi argomenti contenenti spazi verrebbero divisi, a meno che gli spazi non siano salvati.
#!/usr/bin/gawk @include "join"; BEGIN {system("python3 -O " join(ARGV, 1, ARGC, " "))}
print("PYTHON_SCRIPT_BEGINNING")
from sys import argv
print("input() 0 ::", input())
print("input() 1 ::", input())
print("argv[0] ::", argv[0])
print("argv[1:] ::", argv[1:])
print("__debug__ ::", __debug__)
# The -O option changes __debug__ to False
print("PYTHON_SCRIPT_END")
Chiamata di echo -e 'aa\nbb' | /tmp/shebang 'arg1' 'arg2 contains spaces' 'arg3\ uses\ \\escapes\\'
stampe:
PYTHON_SCRIPT_BEGINNING
input() 0 :: aa
input() 1 :: bb
argv[0] :: /tmp/shebang
argv[1:] :: ['arg1', 'arg2', 'contains', 'spaces', 'arg3 uses \\escapes\\']
__debug__ :: False
PYTHON_SCRIPT_END
Per le versioni awk precedenti alla 4.1, dovrai usare la concatenazione di stringhe all'interno di un ciclo for, vedi esempio funzione https://www.gnu.org/software/gawk/manual/html_node/Join-Function.html .