जैसा कि @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इसके बजाय भागो ।