जैसा कि @dessert ने बताया , यहां समस्या यह है कि आपकी स्क्रिप्ट में एक शेल्टिंग लाइन नहीं है । शेबंग के बिना, sudo
फ़ाइल का उपयोग करके चलाने का प्रयास करने के लिए डिफ़ॉल्ट होगा /bin/sh
। मुझे यह कहीं भी प्रलेखित नहीं मिला, लेकिन मैंने उस sudo
स्रोत कोड की जांच करके पुष्टि की जहां मुझे फ़ाइल में निम्नलिखित मिला pathnames.h
:
#ifndef _PATH_BSHELL
#define _PATH_BSHELL "/bin/sh"
#endif /* _PATH_BSHELL */
इसका अर्थ है "यदि चर _PATH_BSHELL
परिभाषित नहीं है, तो इसे सेट करें /bin/sh
"। फिर, configure
स्रोत टारबॉल में शामिल स्क्रिप्ट में, हमारे पास है:
for p in "/bin/bash" "/usr/bin/sh" "/sbin/sh" "/usr/sbin/sh" "/bin/ksh" "/usr/bin/ksh" "/bin/bash" "/usr/bin/bash"; do
if test -f "$p"; then
found=yes
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $p" >&5
$as_echo "$p" >&6; }
cat >>confdefs.h <<EOF
#define _PATH_BSHELL "$p"
EOF
break
fi
done
इस पाश के लिए दिखेगा /bin/bash
, /usr/bin/sh
, /sbin/sh
, /usr/sbin/sh
या /bin/ksh
और फिर सेट _PATH_BSHELL
करने के लिए जो भी पहले मिला था । चूंकि /bin/sh
सूची में यह पहले था और यह मौजूद है, _PATH_BSHELL
पर सेट है /bin/sh
। इस सब का नतीजा यह है कि sudo
जब तक अन्यथा परिभाषित नहीं किया जाता है तब तक का डिफ़ॉल्ट शेल /bin/sh
।
इसलिए, उबंटू sudo
का उपयोग करके चीजों को चलाने के लिए डिफ़ॉल्ट होगा /bin/sh
, जो कि एक सिम्क्लिन है dash
, एक न्यूनतम पॉज़िक अनुपालन शेल:
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Feb 27 2015 /bin/sh -> dash
[[
निर्माण एक बैश सुविधा, यह POSIX मानक से परिभाषित नहीं है जाता है और द्वारा नहीं समझा गया है dash
:
$ bash -c '[[ true ]] && echo yes'
yes
$ dash -c '[[ true ]] && echo yes'
dash: 1: [[: not found
विस्तार से, आपके द्वारा किए गए तीन इनवोकेशन में:
./test.sh
नहीं sudo
; एक शेलबैंग लाइन की अनुपस्थिति में, आपका शेल फ़ाइल को स्वयं निष्पादित करने का प्रयास करेगा। चूंकि आप भाग रहे हैं bash
, यह प्रभावी रूप से चलेगा bash ./test.sh
और काम करेगा।
sudo su
इसके बाद ./test.sh
।
यहां, आप उपयोगकर्ता के लिए एक नया शेल शुरू कर रहे हैं root
। यह $SHELL
उस उपयोगकर्ता के लिए पर्यावरण चर में जो भी शेल परिभाषित किया गया है, और उबंटू पर, रूट का डिफ़ॉल्ट शेल है bash
:
$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
sudo ./test.sh
यहां, आप sudo
कमांड को सीधे निष्पादित करने दे रहे हैं। चूंकि इसका डिफ़ॉल्ट शेल /bin/sh
ऊपर बताया गया है, इसलिए यह स्क्रिप्ट को चलाने का कारण बनता है /bin/sh
, जो कि है dash
और यह तब से विफल है जब से dash
यह समझ में नहीं आता है [[
।
ध्यान दें : sudo
डिफ़ॉल्ट शेल कैसे सेट करता है, इसका विवरण थोड़ा अधिक जटिल लगता है। मैंने अपने उत्तर में बताई गई फाइलों को बदलने की कोशिश की, /bin/bash
लेकिन sudo
अभी भी चूक हो रही थी /bin/sh
। इसलिए स्रोत कोड में कुछ अन्य स्थान होने चाहिए जहां डिफ़ॉल्ट शेल परिभाषित किया गया है। फिर भी, मुख्य बिंदु (वह sudo
चूक sh
) अभी भी खड़ा है।
sudo su
। बसsudo -i
याsudo -s
इसके बजाय भागो ।