लिपियों में जरूरी नहीं कि एक शेबंग हो
स्क्रिप्ट दुभाषिया से चला गया था, तो आप यकीन है कि यह मामला है नहीं हो सकता सब पर । स्क्रिप्ट, दुभाषिया से चलाने कुटिया की जरूरत नहीं है , यदि आप कोड को चलाने के लिए दुभाषिया कहते हैं।
इसलिए इसका उत्तर नहीं है, ऐसी कोई आज्ञा नहीं है जो यह सुनिश्चित करे कि स्क्रिप्ट को चलाने के लिए भाषा (दुभाषिया) क्या है। आप हमेशा स्क्रिप्ट के अंदर देख सकते हैं और यह देख सकते हैं कि उसके पास पता लगाने के लिए शेबंग है या नहीं।
संक्षेप में नियम:
- जब आप स्क्रिप्ट चलाते हैं, तो दुभाषिया को कॉल करना हमेशा संभव है कि शेबांग, निष्पादन योग्य या नहीं, शेबंग या नहीं को ओवररेल करता है।
- यदि निष्पादन योग्य नहीं है और दुभाषिया से नहीं चलते हैं , तो स्क्रिप्ट को कोई शेबंग की आवश्यकता नहीं है।
- यदि स्क्रिप्ट पहले दुभाषिया को बुलाए बिना चलाया जाता है, तो उसे यह जानने की आवश्यकता है (और उपयोग करता है) कि क्या दुभाषिया को कॉल करने के लिए पता लगाने के लिए, और इसके शेपबिटर से दुभाषिया को बुलाने के लिए "अनुमति" लेने के लिए निष्पादन योग्य होना चाहिए।
यदि स्क्रिप्ट में कोई भी शेबंग नहीं है, लेकिन स्क्रिप्ट के अंदर कोई (प्रत्यक्ष *) जानकारी नहीं है जो यह बताए कि किस दुभाषिया का उपयोग करना है।
यह कहने के बाद
आप निश्चित रूप से हमेशा एक रैपर स्क्रिप्ट लिख सकते हैं ताकि यह पता लगाने की कोशिश की जा सके कि स्क्रिप्ट में शेबंग है और उस से दुभाषिया को पढ़ा है, बाद में इसे पाया गया दुभाषिया से चलाएं।
एक उदाहरण
#!/usr/bin/env python3
import subprocess
import sys
args = sys.argv[1:]; script = args[0]
try:
lang = open(script).readlines()[0].replace("#!", "").strip().split()[-1]
cmd = [lang, script]+args[1:]
subprocess.call(cmd)
except (PermissionError, FileNotFoundError, IndexError):
print("No valid shebang found")
इसे इस रूप tryrun
में सहेजें $PATH
(उदाहरण के लिए ~/bin
, यदि यह मौजूद नहीं है तो निर्देशिका बनाएं, लॉग आउट करें और वापस जाएं), इसे निष्पादित करें । फिर चल रहा है:
tryrun /path/to/nonexecutablescript
कॉल (परीक्षण) मेरे गैर-निष्पादन योग्य python
और bash
स्क्रिप्ट पर सही दुभाषिया ।
व्याख्या
- स्क्रिप्ट बस स्क्रिप्ट की पहली पंक्ति को पढ़ती है,
#!
दुभाषिया को हटाने के लिए शेष का उपयोग करती है।
- यदि यह एक वैध दुभाषिया को कॉल करने में विफल रहता है, तो यह
PermissionError
या तो एक को बढ़ा देगा FileNotFoundError
।
ध्यान दें
विस्तार ( .sh
, .py
आदि) लिनक्स पर उचित दुभाषिया का निर्धारण करने में कोई भूमिका नहीं जो भी निभाता है।
(*) कोड से वाक्य रचना निर्धारित करने के लिए "स्मार्ट" अनुमान-एल्गोरिदम विकसित करना निश्चित रूप से संभव है।)