शेबंग, दुभाषिया और एक स्क्रिप्ट


0

shebangकिसी स्क्रिप्ट को निष्पादित करने के लिए दुभाषिया का उपयोग करने के लिए एक लाइन का उपयोग कर सकते हैं :

#!/bin/bash
echo "Hello world"

मेरा प्रश्न यह है कि हम स्क्रिप्ट में कैसे निर्धारित कर सकते हैं कि दुभाषिया वास्तव में उपयोग किया जाता है। निम्नलिखित काम नहीं करता है:

echo $0
echo $SHELL

यदि स्क्रिप्ट निष्पादित हो रही है, तो शेबंग लागू होता है, इसलिए जब तक कि मैंने बैश नहीं किया है /bin/bash, यह बैश है। यदि स्क्रिप्ट की व्याख्या की जा रही है (खट्टी), तो आप हमेशा नहीं बता सकते क्योंकि कोई भी कोड जो इसके खिलाफ जांच करता है उसे दुभाषिया के लिए वैध होना चाहिए; और मैं किसी भी दुभाषिया का उपयोग कर सकता हूं, यहां तक ​​कि सबसे पागल भी। तुलना करें: कैसे पता लगाया जाए कि किसी स्क्रिप्ट में खटास आ रही है
कामिल मैकियोरोस्की

@KamilMaciorowski नहींं; शेबबैंग को अक्सर एक स्क्रिप्ट के साथ चलाकर ओवरराइड किया जाता है sh scriptname- यह शेबबैंग को अनदेखा करता है और स्क्रिप्ट को जो भी "श" के साथ चलाता है वह पहले $PATH(और यहां तक ​​कि अगर बैश है, तो यह कुछ बैश एक्सटेंशन के साथ चलता है)।
गॉर्डन डेविसन

@Gordon मैं एक स्क्रिप्ट निष्पादित ./scriptname, जैसे , फ़ाइल निष्पादन योग्य होना चाहिए, ps -eदिखाता है scriptname। मैं एक स्क्रिप्ट की व्याख्या करता हूं sh scriptname, फ़ाइल निष्पादन योग्य नहीं हो सकती है, ps -eदिखाता है sh। मैं इन दो तरीकों को कैसे नाम देता हूं अप्रासंगिक। मेरा मुख्य बिंदु था: व्याख्यात्मक स्क्रिप्ट के भीतर से दुभाषिया को बताना असंभव है, जब तक कि आप इस विशेष दुभाषिया के लिए तैयार न हों। मुझे एक स्क्रिप्ट का पता लगाता है कि दिखाएँ bashजब साथ चलाने bashका पता लगाता है pythonजब साथ चलाने pythonऔर पता लगाता है bazbazजब के साथ चलाने के bazbaz(एक दुभाषिया आप के बारे में कुछ भी नहीं पता)। पूरा विचार त्रुटिपूर्ण है।
कामिल मैकियोरोस्की

जवाबों:


0

अगर मैं आपको सही तरीके से समझता हूं, तो आप स्क्रिप्ट की पहली पंक्ति से शेल निकालना चाहते हैं।

जब आप उपयोग $SHELLकरते हैं तो आप उस शेल को दिखा रहे हैं जो आप वास्तव में उपयोग कर रहे हैं, जो कि पहली पंक्ति में निर्दिष्ट के समान नहीं है: उदाहरण के लिए, आप वर्तमान में चल रहे शेल में किसी भी स्क्रिप्ट को चलाने के लिए ./ sourceकमांड का उपयोग कर सकते हैं ।

निम्नलिखित पहली पंक्ति से शेल दिखाएगा:

sed -n '1 s/^#!//p' "$0"

यहां $0रनिंग स्क्रिप्ट है, और sedकमांड पहली लाइन को प्रमुख #!हटाए जाने के साथ प्रिंट करता है। यदि ऐसी कोई रेखा नहीं है, तो कुछ भी वापस नहीं किया जाएगा, और आप इसके लिए जांच कर सकते हैं।

आप कमांड $(...)से मान प्राप्त करने के लिए उपयोग कर सकते हैं sed, जैसे: -

echo Script "$0" is running with "$SHELL"
echo It should run with "$(sed -n '1 s/^#!//p' "$0")"

0

उपयोग:

echo $(readlink -e /proc/$$/exe)

(दूसरे शब्दों में, अपनी प्रक्रिया के लिए निष्पादन योग्य की जाँच करें)।

संपादित करें: ऐसा लगता $SHELLहै कि विश्वसनीय नहीं है। इसे एक idshellफ़ाइल में रखें :

echo I am process $$
echo SHELL is $SHELL
echo /proc/$$/exe is $(readlink -e /proc/$$/exe)

और तब के आउटपुट की तुलना करें:

>bash idshell
I am process 24012
SHELL is /bin/bash
/proc/24012/exe is /bin/bash

तथा

>dash idshell
I am process 24062
SHELL is /bin/bash
/proc/24062/exe is /bin/dash

तो, dashझूठ बोल रहा है ??? (और इसलिए shजब से यह dashमेरे उबंटू को हल करता है )।


1
क्या यह बेकार उपयोग नहीं है echo?
कामिल मैकियोरोस्की

@KamilMaciorowski - यह शाब्दिक उदाहरण में है, लेकिन यह अन्य उपयोगों, जैसे कि एक चर को निर्दिष्ट करने या एक स्ट्रिंग तुलना करने के लिए सुझाव देने के लिए है।
AFH

क्या यह किसी से अलग है echo "$SHELL"?
AFH

@kamil echo 'Just an example...' | cat :)
xenoid

@ एसएपीएच $SHELLपर्याप्त विश्वसनीय नहीं लगता है, मेरे संपादित जवाब देखें।
ज़ेनॉइड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.