USER
मेरी स्क्रिप्ट में एक चर है, और मैं चर के HOME
आधार पर उसका रास्ता देखना चाहता हूं USER
। मैं उसे कैसे कर सकता हूँ?
USER
मेरी स्क्रिप्ट में एक चर है, और मैं चर के HOME
आधार पर उसका रास्ता देखना चाहता हूं USER
। मैं उसे कैसे कर सकता हूँ?
जवाबों:
एक उपयोगिता है जो उपयोगकर्ता की जानकारी की परवाह किए बिना चाहे वह जानकारी स्थानीय फ़ाइलों जैसे कि /etc/passwd
LDAP या किसी अन्य विधि में संग्रहीत हो । इसे कहते हैं getent
।
इसमें से उपयोगकर्ता जानकारी प्राप्त करने के लिए, आप चलाते हैं getent passwd $USER
। आपको एक पंक्ति वापस मिलेगी जो दिखता है:
[jenny@sameen ~]$ getent passwd jenny
jenny:*:1001:1001:Jenny Dybedahl:/home/jenny:/usr/local/bin/bash
अब आप बस इसमें से होम डायर काट सकते हैं, जैसे कि कट का उपयोग करके, जैसे:
[jenny@sameen ~]$ getent passwd jenny | cut -d: -f6
/home/jenny
~foo
चर में उपयोग नहीं कर सकते हैं bash
। वैसे भी सीधे नहीं।
~
टैब-विस्तार, हालांकि प्रतीत होता है, और का एक और spec'd व्यवहार टिल्ड-उपसर्ग का उपयोग कर प्राप्त लॉगिन नाम के साथ जुड़े प्रारंभिक कार्यशील निर्देशिका के पथ नाम से बदल दिया जाएगा getpwnam()
समारोह और इतने शायद कि देखने में बहुत अच्छा है। मुझे टैब-विस्तार पसंद नहीं है, हालांकि - मुझे टैब टाइप करना पसंद है।
आप eval
किसी के घर निर्देशिका प्राप्त करने के लिए उपयोग कर सकते हैं ।
eval echo "~$USER"
कम से कम स्थानीय उपयोगकर्ताओं के लिए यह सुनिश्चित करने के लिए काम करता है। मुझे नहीं पता कि एलडीएपी जैसे रिमोट यूजर्स को संभाला जाता है या नहीं eval
।
eval
की जरूरत है। ~foo
परिवर्तनशील विस्तार के बाद बैश प्रक्रिया नहीं करता है ।
USER
।
$USER
तक फैलता है ।
सामान्य स्थान है /home/$USER
, लेकिन इसका सार्वभौमिक होना जरूरी नहीं है। ऐसी जानकारी खोजने के लिए निश्चित स्थान फ़ाइल के अंदर है /etc/passwd
।
वह फ़ाइल विश्व पठनीय है (कोई भी इसे पढ़ सकता है), इसलिए किसी भी उपयोगकर्ता की सामग्री तक पहुंच है।
यदि फ़ाइल में $ USER मौजूद है, तो पिछली में प्रविष्टि उपयोगकर्ता HOME डायरेक्टरी है।
यह प्रविष्टि का चयन करेगा और गृह निर्देशिका प्रिंट करेगा:
awk -v FS=':' -v user="$USER" '($1==user) {print $6}' "/etc/passwd"
अधिक जटिल (रिमोट) सिस्टम के लिए, एनएसएस (नाम सेवा स्विच लाइब्रेरी) सिस्टम से उपयोगकर्ताओं को जानकारी प्राप्त करने के लिए गेटेंट सामान्य आदेश है।
की एक कमान
echo $(getent passwd $USER )| cut -d : -f 6
समकक्ष जानकारी प्रदान करेगा (यदि उपलब्ध हो)।
यदि उपयोगकर्ता मौजूद नहीं है, getent
तो त्रुटि वापस आएगी।
यहां एक छोटा शेल फ़ंक्शन है जो बाहर निकलने के कोड को अनदेखा नहीं करता है getent
:
get_home() {
local result; result="$(getent passwd "$1")" || return
echo $result | cut -d : -f 6
}
यहाँ एक उदाहरण है:
da_home="$(get_home missing_user)" || {
echo 'User does NOT exist!'; exit 1
}
# Now do something with $da_home
echo "Home directory is: '$da_home'"
यदि आप रूट के रूप में लॉग इन हैं, यदि आप USER
पासवर्ड जानते हैं, या यदि आपके USER
पास कोई पासवर्ड नहीं है, तो निम्नलिखित एक और विकल्प है:
su -c 'echo ~' ${USER}
मानक su
व्यवहार के तहत , यदि USER
अपरिभाषित या खाली है, तो su
कमांड को रूट के रूप में चलाने का प्रयास करेंगे।
यदि मान USER
मान्य उपयोगकर्ता नाम नहीं है, तो एक उचित त्रुटि उठाई जाएगी su: user <user> does not exist
:।
यहाँ पहले से ही बहुत सारे अच्छे उत्तर हैं लेकिन यह अभी भी किसी की मदद कर सकता है।