मैं किस स्तर के गोले को जान सकता हूँ?


32

अगर मैं एक टर्मिनल खोलता हूं तो मेरे xtermपास एक शेल होगा। फिर अगर मैं उपयोग करता हूं sshया zshमेरे पास शेल का एक और "स्तर" होगा। क्या उन सभी से बाहर निकलने के लिए मुझे यह जानने का एक तरीका है कि मुझे कितनी बार Ctrl+Dया टाइप exitकरना है? मेरा असली इरादा "जड़" खोल को छोड़कर सब कुछ से बाहर निकलने का है।

यह जानना भी अच्छा होगा screenकि समाधान पर टर्मिनल मल्टीप्लेक्सर्स (जैसे ) का क्या प्रभाव पड़ता है ।

पुनश्च: कृपया शीर्षक बदलने के लिए स्वतंत्र महसूस करें, मुझे नहीं पता कि क्या वे सही शब्द हैं।

जवाबों:


6

ps --no-headers -o comm $PPIDआपके शेल प्रॉम्प्ट के परिणाम को जोड़ने के लिए एक (संयुक्त रूप से सही नहीं) तरीका है । यह आपको उस प्रक्रिया का नाम बताएगा जिसने आपके शेल को जन्म दिया। यदि आप नेस्टेड zsh के अंदर हैं, तो यह "zsh" कहेगा। यदि आप शीर्ष स्तर के ज़िश के अंदर हैं, तो यह "xterm" या "स्क्रीन" या जो भी आपके शेल में चल रहा है, पढ़ेगा।

यह बताने के लिए कि क्या आप ssh या su सत्र के अंदर हैं, आप बस अपने प्रॉम्प्ट के होस्टनाम और उपयोगकर्ता नाम भाग को देख सकते हैं।

जब आप नेस्टेड स्क्रीन चला रहे हों (जो मुझे नहीं लगता कि एक सामान्य स्थिति है), तो ऐसा कोई तरीका नहीं है जिससे मैं यह बता सकूं कि आप नेस्टेड स्क्रीन के शीर्ष-स्तरीय शेल में हैं या शीर्ष-स्तरीय शेल शीर्ष स्तर की स्क्रीन के। यदि आप नेस्टेड स्क्रीन में हैं, तो आप हमेशा एक स्टेटस लाइन प्रदर्शित करने के लिए स्क्रीन को कॉन्फ़िगर कर सकते हैं, जिससे कई स्टेटस लाइन प्रदर्शित होंगी।


आआह… स्नैप .. मुझे हराओ। :) +1
स्टीफन

वर्तमान में मैं एक पर हूँ MAC और कमांड मुझे दिया ps: illegal option -- -, किसी भी विचार क्यों? मैं इसे जल्द ही फिर से लिनक्स में टेस्ट करूंगा :)
phunehehe

3
@phunehehe: --option-nameज्यादातर एक जीएनयू-विशिष्ट विशेषताएं हैं, इसलिए ज्यादातर लिनक्स के बाहर मानक सिस्टम उपयोगिताओं में उपलब्ध नहीं है। लेकिन आप कॉलम के नाम के बाद ps --no-headersजोड़कर पोर्ट्रेट का प्रभाव प्राप्त कर सकते हैं =। इसके अलावा commस्तंभ POSIX नहीं है, लेकिन cmdस्तंभ (जिसमें कमांड के तर्क शामिल हैं) है। -pPOSIX सिंटैक्स में PID से पहले भी आवश्यक है। इसलिए ps -o cmd= -p $PPIDपोर्टेबल है और इसी तरह की जानकारी देता है।
गिल्स का SO- बुराई होना बंद हो '

पुष्टि की है, Gentoo पर काम करता है
phunehehe

2
@phunehehe: क्षमा करें, मैंने ऊपर टिप्पणी में एक गलती की है। वास्तव में commस्तंभ POSIX द्वारा निर्दिष्ट किया गया है और मैक ओएस एक्स पर प्रलेखित है, जबकि cmdस्तंभ लिनक्स पर मौजूद है , लेकिन मानक नहीं है।
गिल्स एसओ- बुराई को रोकना '

37

आप वास्तव में सही टर्म पर हिट हैं। एक पर्यावरण चर है SHLVLजो सभी प्रमुख संवादात्मक गोले (बाश, tsh, zsh) 1 से वृद्धि करते हैं जब वे शुरू करते हैं। इसलिए यदि आप एक शेल के अंदर एक शेल शुरू करते हैं, तो SHLVL1 से बढ़ जाता है।

हालांकि, यह सीधे आपकी चिंता का जवाब नहीं देता है, क्योंकि SHLVLटर्मिनल एमुलेटर जैसी चीजों पर काम करता है। उदाहरण के लिए, मेरे विशिष्ट विन्यास में, $SHLVLएक एक्सटर्म में 2 है, क्योंकि स्तर 1 मेरे एक्स सत्र ( ~/.xinitrcया ~/.xsession) को चलाने वाले शेल से मेल खाती है ।

मैं $SHLVLअपने प्रॉम्प्ट में प्रदर्शित करने के लिए क्या कर रहा हूं, लेकिन केवल अगर शेल की मूल प्रक्रिया एक और शेल है ("जैसे नाम के साथ यदि इसका नाम shप्लस वैकल्पिक विराम चिह्न और अंकों में समाप्त होता है , तो यह एक शेल है")। इस तरह, मेरे पास एक शेल के दूसरे मामले में चल रहे असामान्य मामले में एक स्पष्ट दृश्य संकेत है।

शायद आप ऐसे शेल का पता लगाना पसंद करेंगे जो एक टर्मिनल एमुलेटर के तहत सीधे चल रहे हैं। ताकि इन गोले जिसकी मूल प्रक्रिया एक अलग नियंत्रित टर्मिनल है कर रहे हैं,: आप इस तरह सटीक रूप से कर सकते हैं ps -o tty= -p$$और ps -o tty= -p$PPIDविभिन्न उत्पादन का उत्पादन। आप SHLVLइन गोले में मैन्युअल रूप से 1 पर रीसेट कर सकते हैं, या इन गोले में अपना खुद TERMSHLVLका 1 सेट कर सकते हैं (और अन्यथा बढ़ा हुआ)।

¹ यद्यपि कोई यह नहीं सोचता कि यह मैनुअल पृष्ठों को देख रहा है: इसके समर्थन में तीन स्तरों में से कोई भी शब्द "स्तर" में शामिल नहीं है SHLVL


कार्यकाल की पुष्टि के लिए धन्यवाद। मैं अभी भी एक पर हूँ MAC और उन 2 आदेशों को खोजने के लिए आश्चर्यचकित हूँ जो मेरे शेल स्तर की परवाह किए बिना एक ही परिणाम देते हैं।
फुनेहे

@phunehehe: क्या 2 कमांड? यदि आप मतलब रखते हैं ps -o tty= -p$pid, तो यह प्रक्रिया को नियंत्रित करने वाले टर्मिनल को दिखाता है, जो टर्मिनल एमुलेटर (xterm, स्क्रीन, sshd, ...) की पहचान करता है कि यह प्रक्रिया चल रही है। यदि आप किसी अन्य शेल से शेल प्रारंभ करते हैं तो यह परिवर्तित नहीं होगा, लेकिन यदि परिवर्तित हो जाएगा। एक नया टर्मिनल एमुलेटर शुरू करें। यदि टर्मिनल एमुलेटर एक देशी मैक एप्लिकेशन है, तो मैक-विशिष्ट सूक्ष्मता हो सकती है जिससे मैं अनजान हूं।
गिल्स एसओ- बुराई को रोकें '

ps -o tty= -p$$ और ps -o tty= -p$PPID , क्योंकि आपने कहा था कि उन्हें अलग-अलग आउटपुट का उत्पादन करना चाहिए। या मैंने कुछ गलत समझा?
फुनेहे

@phunehehe: यदि शेल की मूल प्रक्रिया एक टर्मिनल एमुलेटर है, तो वे अलग-अलग आउटपुट देते हैं, क्योंकि टर्मिनल एमुलेटर में कंट्रोलिंग टर्मिनल के रूप में अपने एमुलेटेड टर्मिनल नहीं होते हैं। यदि आप अन्यथा पाते हैं, तो कृपया ps -p $$ -p $PPID(फिर से, मेरे पास कोई OSX अनुभव नहीं है, का उत्पादन पोस्ट करें , इसलिए शायद OSX पर कुछ असामान्य चल रहा है)।
गाइल्स का SO- बुराई पर रोक '12

@ गिल्स: यह वास्तव में OSX के साथ कुछ असामान्य था। मैंने Gentoo पर परीक्षण किया और जैसा आपने कहा था सब कुछ सही था। OSX पर, ps -p $$ -p $PPIDदेता है (क्षमा करें, मुझे पता नहीं है कि टिप्पणी कैसे प्रारूपित की जाती है) PID TTY TIME CMD 209 ttys000 0: 00.01 लॉगिन -pf phunehehe 210 ttys000 0: 00.12 -बैश
phunehehe

1

बहुत सुरुचिपूर्ण नहीं है, लेकिन आप अपने शेल के माता-पिता-बच्चे के संबंध को अन्य चल रही सफलताओं को देखने के लिए htop में ट्री व्यू का उपयोग कर सकते हैं ।

$ htop # then press 't' and scroll around or 'Ctrl-W' to find your shell proccess

और "रूट" शेल पर आने से पहले, गोले के अमाउंट को कम करने के लिए आपको बाहर निकलने की आवश्यकता होगी


1

आप पर्यावरण चर SHLVL का उपयोग कर सकते हैं :

echo "$SHLVL"

1
यदि आप sshउदाहरण के लिए उसी खाते का उपयोग करते हैं तो यह अभी भी होगा1
एंथन

0

मैंने उसे ढूंढ लिया

$ pstree -u | grep ${USER}

यह देखने के लिए काफी मददगार हो सकता है कि मैं सिस्टम पर "फिट" कहाँ हूँ। मैं इसे पसंद करता हूं pstree -u ${USER}

कभी-कभी यह मुझे याद दिलाता है कि मैंने nohupनौकरी छोड़ दी है, या इसी तरह।

(इसके अलावा, मैं उपयोग करता हूं alias grep='grep --color=auto'।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.