लिनक्स पर, शेबंग बहुत लचीला नहीं है; कई जवाबों के अनुसार ( स्टीफन किट का जवाब और जोर्ज डब्ल्यू मित्तग के ), एक शेबिंग लाइन में कई तर्कों को पारित करने का कोई निर्दिष्ट तरीका नहीं है।
मुझे यकीन नहीं है कि यह किसी के लिए भी उपयोगी होगा, लेकिन मैंने कमी की सुविधा को लागू करने के लिए एक छोटी स्क्रिप्ट लिखी है। Https://gist.github.com/loxaxs/7cbe84aed1c38cf18f70d8427bed1aa देखें ।
एम्बेडेड वर्कअराउंड लिखना भी संभव है। Bellow, मैं चार भाषा-अज्ञेयवादी कार्यपट्टियों को एक ही परीक्षण स्क्रिप्ट पर लागू करता हूं और परिणाम प्रत्येक प्रिंट करता है। मुझे लगता है कि स्क्रिप्ट निष्पादन योग्य है और अंदर है /tmp/shebang
।
प्रक्रिया प्रतिस्थापन के अंदर एक बैश वंशानुगत में अपनी स्क्रिप्ट लपेटकर
जहाँ तक मुझे पता है, यह इसे करने का सबसे विश्वसनीय भाषा-अज्ञेय तरीका है। यह तर्कों को पारित करने और स्टड को संरक्षित करने की अनुमति देता है। दोष यह है कि दुभाषिया उस फ़ाइल के वास्तविक (वास्तविक) स्थान को नहीं जानता जो वह पढ़ता है।
#!/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
) "$@"
कॉलिंग echo -e 'aa\nbb' | /tmp/shebang 'arg1' 'arg2 contains spaces' 'arg3\ uses\ \\escapes\\'
प्रिंट:
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
ध्यान दें कि प्रतिस्थापन की प्रक्रिया एक विशेष फ़ाइल का उत्पादन करती है। यह सभी निष्पादन योग्य के अनुरूप नहीं हो सकता है। उदाहरण के लिए, #!/usr/bin/less
शिकायत करता है:/dev/fd/63 is not a regular file (use -f to see it)
मुझे नहीं पता कि क्या डैश में प्रक्रिया प्रतिस्थापन के अंदर हेरेडोक होना संभव है।
एक साधारण वंशानुगत में अपनी स्क्रिप्ट लपेटना
छोटा और सरल, लेकिन आप stdin
अपनी स्क्रिप्ट तक नहीं पहुंच पाएंगे और इसके लिए दुभाषिया को एक स्क्रिप्ट को पढ़ने और निष्पादित करने में सक्षम होना चाहिए 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
कॉलिंग echo -e 'aa\nbb' | /tmp/shebang 'arg1' 'arg2 contains spaces' 'arg3\ uses\ \\escapes\\'
प्रिंट:
PYTHON_SCRIPT_BEGINNING
input() caused EOFError
argv[0] :: -
argv[1:] :: ['arg1', 'arg2 contains spaces', 'arg3\\ uses\\ \\\\escapes\\\\']
__debug__ :: True
PYTHON_SCRIPT_END
अजीब system()
कॉल का उपयोग करें लेकिन तर्कों के बिना
सही ढंग से निष्पादित फ़ाइल का नाम गुजरता है, लेकिन आपकी स्क्रिप्ट आपके द्वारा दिए गए तर्कों को प्राप्त नहीं करेगी। ध्यान दें कि awk एकमात्र ऐसी भाषा है जिसे मैं जानता हूं कि दोनों दुभाषिया डिफ़ॉल्ट रूप से लिनक्स पर स्थापित हैं और इसके निर्देशों को डिफ़ॉल्ट रूप से कमांड लाइन से पढ़ते हैं।
#!/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")
कॉलिंग echo -e 'aa\nbb' | /tmp/shebang 'arg1' 'arg2 contains spaces' 'arg3\ uses\ \\escapes\\'
प्रिंट:
PYTHON_SCRIPT_BEGINNING
input() 0 :: aa
input() 1 :: bb
argv[0] :: /tmp/shebang
argv[1:] :: []
__debug__ :: False
PYTHON_SCRIPT_END
4.1+ system()
कॉल का उपयोग करें, बशर्ते आपके तर्कों में रिक्त स्थान न हों
अच्छा है, लेकिन केवल अगर आपको यकीन है कि आपकी स्क्रिप्ट को रिक्त स्थान वाले तर्कों के साथ नहीं बुलाया जाएगा। जब तक आप देख सकते हैं, आपके तर्क रिक्त स्थान से विभाजित हो जाएंगे, जब तक कि रिक्त स्थान बच न जाए।
#!/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")
कॉलिंग echo -e 'aa\nbb' | /tmp/shebang 'arg1' 'arg2 contains spaces' 'arg3\ uses\ \\escapes\\'
प्रिंट:
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 से नीचे के awk संस्करणों के लिए, आपको लूप के लिए स्ट्रिंग कॉन्टेनेशन का उपयोग करना होगा, उदाहरण के लिए कार्य देखें https://www.gnu.org/software/gawk/manual/html_node/Join-Function.html ।