@ ডিজিটর ব্যাখ্যা হিসাবে , এখানে সমস্যাটি হ'ল আপনার স্ক্রিপ্টে শেবাং লাইন নেই । একটি শেবাং ছাড়াই, 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পরিবর্তে।