Linux'ta, shebang çok esnek değildir; Birden fazla cevaba göre ( Stephen Kitt'in cevabı ve Jörg W Mittag'ın ), bir Shebang hattında birden fazla argüman iletmenin belirlenmiş bir yolu yoktur.
Kimseye faydası olacak mı emin değilim, ama eksik özelliğini uygulamak için kısa bir senaryo yazdım. Bkz. Https://gist.github.com/loxaxs/7cbe84aed1c38cf18f70d8427bed1efa .
Gömülü geçici çözümler yazmak da mümkündür. Bu arada , aynı test betiğine uygulanan dört dilde-agnostik geçici çözüm sunuyorum ve sonuçların her biri yazdırılıyor. Komut dosyasının çalıştırılabilir olduğunu ve içinde olduğunu varsayalım /tmp/shebang
.
Senaryoyu proses değiştirme içerisinde bir bash heredocuna sarma
Bildiğim kadarıyla, bunu yapmanın en güvenilir dil-agnostik yolu. Argümanların geçmesine izin verir ve stdin'i korur. Dezavantajı, yorumlayıcının okuduğu dosyanın (gerçek) konumunu bilmemesidir.
#!/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
) "$@"
Çağrı echo -e 'aa\nbb' | /tmp/shebang 'arg1' 'arg2 contains spaces' 'arg3\ uses\ \\escapes\\'
baskıları:
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
İşlem değişikliğinin özel bir dosya oluşturduğunu unutmayın. Bu tüm çalıştırılabilirlere uygun olmayabilir. Örneğin, #!/usr/bin/less
şikayet eder:/dev/fd/63 is not a regular file (use -f to see it)
Süreç içerisinde heredoksanın çizgi içinde olması mümkün mü bilmiyorum.
Senaryoyu basit bir esrarla sarmala
Daha kısa ve basittir, ancak stdin
betiğinizden erişemezsiniz ve tercümanın bir betiği okuyabilmesi ve çalıştırabilmesi gerekir 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
Çağrı echo -e 'aa\nbb' | /tmp/shebang 'arg1' 'arg2 contains spaces' 'arg3\ uses\ \\escapes\\'
baskıları:
PYTHON_SCRIPT_BEGINNING
input() caused EOFError
argv[0] :: -
argv[1:] :: ['arg1', 'arg2 contains spaces', 'arg3\\ uses\\ \\\\escapes\\\\']
__debug__ :: True
PYTHON_SCRIPT_END
Awk system()
çağrısını kullanın, ancak bağımsız değişkenler olmadan
Yürütülen dosyanın adını doğru şekilde iletir, ancak komut dosyanız verdiğiniz bağımsız değişkenleri almaz. Awk'nin, tercümanı varsayılan olarak linux'da yüklü olduğunu bildiğim tek dil olduğunu ve talimatlarını varsayılan olarak komut satırından okuduğunu unutmayın.
#!/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")
Çağrı echo -e 'aa\nbb' | /tmp/shebang 'arg1' 'arg2 contains spaces' 'arg3\ uses\ \\escapes\\'
baskıları:
PYTHON_SCRIPT_BEGINNING
input() 0 :: aa
input() 1 :: bb
argv[0] :: /tmp/shebang
argv[1:] :: []
__debug__ :: False
PYTHON_SCRIPT_END
Bağımsız system()
değişkenlerinizi boşluk içermemesi koşuluyla awk 4.1+ çağrısı kullanın
Güzel, ancak yalnızca komut dosyanızın boşluk içeren argümanlarla çağrılmayacağından eminseniz. Gördüğünüz gibi, boşluklar dışında bırakılmadıkça boşluk içeren değişkenleriniz bölünmüş olur.
#!/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")
Çağrı echo -e 'aa\nbb' | /tmp/shebang 'arg1' 'arg2 contains spaces' 'arg3\ uses\ \\escapes\\'
baskıları:
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
4.1'in altındaki awk sürümleri için, for döngüsü içinde string birleştirme kullanmanız gerekir, bkz. Örnek fonksiyon https://www.gnu.org/software/gawk/manual/html_node/Join-Function.html .