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