शेल स्क्रिप्ट के भीतर उपयोगकर्ता के डिफ़ॉल्ट शेल का पता लगाना


10

मैं सोच रहा था कि क्या शेल स्क्रिप्ट के भीतर वर्तमान उपयोगकर्ता के डिफ़ॉल्ट शेल का पता लगाने का कोई तरीका है?

मामले का उपयोग करें: मैं एक स्क्रिप्ट पर काम कर रहा हूं जो एक कमांड के लिए एक उपनाम सेट करता है और यह उपनाम शेल स्क्रिप्ट के भीतर सेट किया गया है।

!# /bin/bash
alias = 'some command to set the alias'

स्क्रिप्ट में एक तर्क है जहां यह उपयोगकर्ता के डिफ़ॉल्ट शेल को खोजने की कोशिश करता है जो स्क्रिप्ट को निष्पादित करता है और इस उपनाम को संबंधित ~ / .bashrc या ~ / .zshrc फ़ाइल में जोड़ता है।

लेकिन जैसा कि मैं स्क्रिप्ट के सामने एक शेबंग जोड़ रहा हूं और स्पष्ट रूप से इसे bash का उपयोग करने के लिए कह रहा हूं , यहां पोस्ट किए गए उत्तर हमेशा अपेक्षित रूप से बैश वापसी करते हैं, हालांकि मैं एक ZSH टर्मिनल पर इस स्क्रिप्ट को निष्पादित कर रहा हूं।

क्या शेल प्रकार प्राप्त करने का एक तरीका है जहां स्क्रिप्ट को शेल्बर सेट की परवाह किए बिना निष्पादित किया जाता है?

मैं एक समाधान की तलाश में हूं जो मैक और सभी लिनक्स आधारित बिस्ट्रो दोनों पर काम करता है।


@StephenRauch मुझे पहले इसका उल्लेख करना चाहिए था, मैं एक ऐसी विधि की तलाश कर रहा हूं जो मैक और लिनक्स आधारित प्रणाली पर काम करती हो। मैक पर / etc / passwd में उपयोगकर्ता की जानकारी और एकल उपयोगकर्ता मोड में केवल इसकी सलाह शामिल नहीं है।
Spaniard89

/etc/passwdOSX पर क्या है ? मुझे त्वरित रूप से ऑनलाइन दिखाई दिया था और ऐसा प्रतीत होता है कि शेल वहाँ है, केवल उपयोगकर्ता नाम नहीं है। उपयोगकर्ता आईडी अभी भी वहाँ है, आप इसका उपयोग क्यों नहीं करते हैं?
terdon

मुझे आश्चर्य होता है कि गोले की एक विस्तृत सूची होना भी संभव है। या क्या सभी शेल स्टार्टअप फाइलें हमेशा अनुरूप होती हैं। {name_of_shell} rc?

जवाबों:


6
$ finger $USER|grep -oP 'Shell: \K.*'
/bin/mksh

धन्यवाद यह एक आकर्षण की तरह काम करता है! यह एकमात्र समाधान है जो शायद मैक और लिनक्स आधारित बिस्ट्रो दोनों के लिए काम करता है।
Spaniard89

1
BTW, मैंने कमांड को थोड़ा सा संपादित किया है ताकि यह सभी OS के लिए अज्ञेय बना सके finger $USER | grep 'Shell:*' | cut -f3 -d ":"क्योंकि grep विकल्प -P मैक पर समर्थित नहीं है।
Spaniard89

2
ध्यान दें कि fingerसभी मशीनों पर स्थापित नहीं किया जा सकता है। यह RedHat आधारित सिस्टम पर एक वैकल्पिक पैकेज है।
स्टीफन हैरिस

1
@ किशोरपांडे: आप getent|grep ^$USER:|cut -f: -f7उंगली के बजाय उपयोग कर सकते हैं , अगर उंगली डिफ़ॉल्ट रूप से स्थापित नहीं की गई थी।

@ Kishorepandey ऐसा न करें। SHELLयदि यह मौजूद है तो पर्यावरण चर का उपयोग करें । उपयोगकर्ता डेटाबेस को देखते हुए आपको एक परिणाम (उपयोगकर्ता का लॉगिन शेल) मिलेगा लेकिन यह सही परिणाम (उपयोगकर्ता का पसंदीदा इंटरैक्टिव शेल) नहीं हो सकता है - यह उपयोगकर्ता के कॉन्फ़िगरेशन पर निर्भर करता है।
गाइल्स का SO- दुष्ट होना बंद करें '

19

पर्यावरण चर, SHELLहमेशा चालान करने वाले उपयोगकर्ता के डिफ़ॉल्ट लॉगिन शेल में फैल जाएगा (इससे मूल्य प्राप्त होता है /etc/passwd)।

किसी भी अन्य उपयोगकर्ता के लिए, आपको कुछ प्रसंस्करण करने की आवश्यकता है /etc/passwd, यहाँ एक सरल awkस्निपेट दिया गया है:

awk -F: -v user="foobar" '$1 == user {print $NF}' /etc/passwd

foobarवास्तविक उपयोगकर्ता नाम के साथ बदलें ।

यदि आपके पास ldap(या जगह में कुछ समान) है, तो getentसीधे पार्स करने के बजाय डेटाबेस प्राप्त करने के लिए उपयोग करें /etc/passwd:

getent passwd | awk -F: -v user="foobar" '$1 == user {print $NF}'

या सबसे स्वच्छ दृष्टिकोण, चलो getentपार्सिंग करें (@Kusalananda के लिए धन्यवाद):

getent passwd foobar | awk -F: '{print $NF}'

3
getent passwd foobarकिसी विशेष लाइन से मेल खाना छोड़ना
Kusalananda

जवाब के लिए धन्यवाद। मुझे पहले इसका उल्लेख करना चाहिए था, मैं एक ऐसी विधि की तलाश कर रहा हूं जो मैक और लिनक्स आधारित प्रणाली पर काम करती हो। मैक पर / etc / passwd में उपयोगकर्ता की जानकारी नहीं होती है और इसका एकल उपयोगकर्ता मोड में केवल परामर्श किया जाता है।
स्पैनियार्डो

4

चूंकि getentMacOS पर एक मानक कमांड नहीं है, इसलिए आप एक निम्न स्तर की getpwuidकॉल का उपयोग करना चाह सकते हैं जो मशीन के लिए कॉन्फ़िगर की गई नामकरण सेवाओं से परामर्श करेगी। यह करने के लिए बाहर बुला आवश्यकता हो सकती है perlया pythonहै, जो सबसे प्लेटफार्मों यूनिक्स की तरह भर में बहुत आम हैं

उदाहरण के लिए, यह वर्तमान उपयोगकर्ता के लिए शेल लौटाएगा:

perl -e '@x=getpwuid($<); print $x[8]'

2

आप इस तरह से उपयोगकर्ता के डिफ़ॉल्ट शेल को पर्यावरण से प्राप्त कर सकते हैं:

echo $SHELL

लेकिन इस तरह नहीं:

echo $0

बाद वाला आपको बताएगा कि आपकी स्क्रिप्ट वर्तमान में किस शेल का उपयोग कर रही है। तो आप ऊपर पहला विकल्प चाहते हैं।



0

शायद यह:

   grep $USER </etc/passwd | cut -f 7 -d ":"

यह पहले से दिए गए उत्तरों में से किसी पर भी सुधार नहीं करता है।
Kusalananda

यह काम नहीं करेगा यदि सामान्य रूप से काम करने वाले कई उपयोगकर्ता हैं; जैसे अगर USER=fredफिर इस से मेल खाएगी fred, frederick, alfred, alfredo...
स्टीफन हैरिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.