এই উত্তরে, এটি পরিষ্কার হওয়া উচিত, আমি অনুমান করি পাঠক পড়তে সক্ষম bash
এবং পসিক্স শেল স্ক্রিপ্টগুলি পছন্দ করে dash
।
আমি বিশ্বাস করি যে এখানে উচ্চারণের মত উত্তরগুলি এর বেশিরভাগ ব্যাখ্যা করার জন্য ভাল কাজ করে বলে এখানে ব্যাখ্যা করার মতো খুব বেশি কিছু নেই।
তবুও, যদি আরও ব্যাখ্যা করার মতো কিছু থাকে তবে মন্তব্য করতে দ্বিধা করবেন না, আমি শূন্যস্থানগুলি পূরণ করার জন্য যথাসাধ্য চেষ্টা করব।
bash
পারফরম্যান্স এবং নির্ভরযোগ্যতার জন্য চূড়ান্ত (কেবল নয় ) সমাধান অনুকূলিতকরণ ; সমস্ত শাঁস সামঞ্জস্যপূর্ণ
নতুন সমাধান:
# bool function to test if the user is root or not
is_user_root () { [ ${EUID:-$(id -u)} -eq 0 ]; }
বেঞ্চমার্ক (ফাইল এ সংরক্ষণ করুন is_user_root__benchmark
)
###############################################################################
## is_user_root() benchmark ##
## Bash is fast while Dash is slow in this ##
## Tested with Dash version 0.5.8 and Bash version 4.4.18 ##
## Copyright: 2020 Vlastimil Burian ##
## E-mail: info@vlastimilburian.cz ##
## License: GPL-3.0 ##
## Revision: 1.0 ##
###############################################################################
# intentionally, the file does not have executable bit, nor it has no shebang
# to use it, please call the file directly with your shell interpreter like:
# bash is_user_root__benchmark
# dash is_user_root__benchmark
# bool function to test if the user is root or not
is_user_root () { [ ${EUID:-$(id -u)} -eq 0 ]; }
# helper functions
print_time () { date +"%T.%2N"; }
print_start () { printf '%s' 'Start : '; print_time; }
print_finish () { printf '%s' 'Finish : '; print_time; }
readonly iterations=10000
printf '%s\n' '______BENCHMARK_____'
print_start
i=1; while [ $i -lt $iterations ]; do
is_user_root
i=$((i + 1))
done
print_finish
আসল সমাধান:
#!/bin/bash
is_user_root()
# function verified to work on Bash version 4.4.18
# both as root and with sudo; and as a normal user
{
! (( ${EUID:-0} || $(id -u) ))
}
if is_user_root; then
echo 'You are the almighty root!'
else
echo 'You are just an ordinary user.'
fi
^^^ স্ট্রাইকড আউট সমাধানটি জিনিসগুলির গতি বাড়ানোর পক্ষে প্রমাণিত হয়নি, তবে এটি দীর্ঘকাল ধরে রয়েছে, সুতরাং আমি যতক্ষণ প্রয়োজন দেখছি এটিকে এখানে রাখব।
ব্যাখ্যা
যেহেতু এটা বৃন্দ গুণ বেশি দ্রুত পড়তে $EUID
মান bash
নির্বাহ করার পরিবর্তে, পরিবর্তনশীল, কার্যকর ব্যবহারকারী আইডি নম্বর id -u
কমান্ড POSIX পর ব্যবহারকারী আইডি এটি এই সমাধানটি একটি চমত্কারভাবে বস্তাবন্দী ফাংশন মধ্যে উভয় সম্মিলন। যদি, এবং যদি কেবলমাত্র $EUID
কোনও কারণে উপলব্ধ না হয় তবে id -u
কমান্ডটি কার্যকর করা হবে, তা নিশ্চিত করে আমরা পরিস্থিতি নির্বিশেষে যথাযথ রিটার্ন মান পাব ।
আমি কেন এত বছর পরে এই সমাধান পোস্ট করব ওপি জিজ্ঞাসা করেছে
ঠিক আছে, আমি যদি সঠিকভাবে দেখতে পাই তবে উপরের কোডটির একটি অনুপস্থিত অংশ মনে হচ্ছে।
আপনি দেখুন, অনেকগুলি ভেরিয়েবল রয়েছে যা বিবেচনায় নিতে হবে এবং এর মধ্যে একটি হ'ল পারফরম্যান্স এবং নির্ভরযোগ্যতা ।
পোর্টেবল পসিক্স সমাধান + উপরের ফাংশনটির ব্যবহারের উদাহরণ
#!/bin/sh
# bool function to test if the user is root or not (POSIX only)
is_user_root() { [ "$(id -u)" -eq 0 ]; }
if is_user_root; then
echo 'You are the almighty root!'
exit 0 # unnecessary, but here it serves the purpose to be explicit for the readers
else
echo 'You are just an ordinary user.' >&2
exit 1
fi
উপসংহার
আপনি যতটা সম্ভবত এটি পছন্দ করেন না, ইউনিক্স / লিনাক্স পরিবেশ অনেক বৈচিত্রপূর্ণ করেছে। মানে এমন কিছু লোক আছে যারা bash
এত বেশি পছন্দ করে তারা এমনকি বহনযোগ্যতা ( পসিক্স শেলস) ভাবেন না । আমার মতো অন্যরাও পসিক্স শেল পছন্দ করে । এটি আজকাল ব্যক্তিগত পছন্দ এবং প্রয়োজনের বিষয়।
id -u
ফিরে আসে0
।