इस जवाब में, यह स्पष्ट होने दें, मुझे लगता है कि पाठक पढ़ने में सक्षम है bash
और जैसे POSIX शेल स्क्रिप्ट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
चर, प्रभावी उपयोगकर्ता आईडी नंबर को पढ़ने के लिए कई गुना तेजी से होता है , POSIX को id -u
कमांड निष्पादित करने की तुलना में-उपयोगकर्ता आईडी ढूंढता है, यह समाधान दोनों को अच्छी तरह से पैक किए गए फ़ंक्शन में जोड़ता है। यदि, और केवल अगर, किसी भी कारण से उपलब्ध नहीं है, तो कमांड निष्पादित हो जाएगी, यह सुनिश्चित करते हुए कि हमें उचित वापसी मूल्य प्राप्त नहीं होता है, चाहे परिस्थितियां क्यों न हों ।$EUID
id -u
मैंने इतने सालों बाद यह समाधान क्यों पोस्ट किया ओपी ने पूछा है
ठीक है, अगर मैं सही ढंग से देखता हूं, तो ऊपर एक अनुपलब्ध कोड प्रतीत होता है।
आप देखते हैं, कई चर हैं जिन्हें ध्यान में रखा जाना चाहिए, और उनमें से एक प्रदर्शन और विश्वसनीयता का संयोजन है ।
पोर्टेबल POSIX समाधान + उपरोक्त फ़ंक्शन के उपयोग का उदाहरण
#!/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
बहुत पसंद करते हैं, वे पोर्टेबिलिटी ( POSIX गोले) के बारे में भी नहीं सोचते हैं । मेरे जैसे अन्य लोग POSIX गोले पसंद करते हैं । यह आजकल व्यक्तिगत पसंद और जरूरतों का मामला है।
id -u
रिटर्न0
।