जवाबों:
यह कार्य कार्य करना चाहिए:
container() {
pid=$$
while true; do
pid=$(ps -h -o ppid -p $pid 2>/dev/null)
case $(ps -h -o comm -p $pid 2>/dev/null) in
(gnome-terminal) echo "Running in gnome terminal";return;;
(xterm) echo "Running in xterm";return;;
(rxvt) echo "Running in rxvt";return;;
(python) if [ ! -z "$(ps -h -o args -p $pid 2>/dev/null | grep guake)" ]; then echo "Running in Guake"; return; fi ;;
esac
[[ $(echo $pid) == 1 ]] && break
done
}
container
bash: [: too many arguments
। अगर यह मदद करता है bash v4.2.24, अजगर v2.7.3 समझे।
इसे इस्तेमाल करे:
echo $TERM
यह अधिक आधिकारिक है, लेकिन आपके कार्यक्रमों द्वारा गड़बड़ की जा सकती है। हालाँकि, खान पर, यह कहता है xterm
और ttys पर यह कहता है linux
, जो मुझे लगता है कि लिनक्स कंसोल के लिए खड़ा है।
$TERM
एक चर है, जो आपके द्वारा उपयोग किए जा रहे टर्मिनल एमुलेटर द्वारा स्वयं-सूचना के रूप में विनिर्देशन को संदर्भित करता है, वास्तविक एमुलेटर को नहीं। उदाहरण के लिए, अपने सिस्टम पर, echo $TERM
रिटर्न xterm
भले ही मैं वास्तव में lxterminal चल रहा हूँ। क्या हो रहा है lxterminal स्व-रिपोर्ट xterm अनुपालन है। lxterminal वास्तव में पूरी तरह से xterm अनुरूप नहीं है, इसलिए आपको बाहर देखना होगा। कल्पना फाइलें आमतौर पर स्थित होती हैं /usr/share/terminfo
।
आप माता-पिता की प्रक्रिया के नाम को पकड़कर, टर्मिनल एमुलेटर नाम प्राप्त कर सकते हैं। इसलिए यह हर टर्मिनल एमुलेटर के साथ काम करता है।
बाश में, zsh, आदि:
basename "/"$(ps -f -p $(cat /proc/$(echo $$)/stat | cut -d \ -f 4) | tail -1 | sed 's/^.* //')
मछली के खोल के साथ:
basename "/"(ps -f -p (cat /proc/(echo %self)/stat | cut -d \ -f 4) | tail -1 | sed 's/^.* //')
कई लिनक्स सिस्टम echo $TERM
रिटर्न में xterm
ऊपर स्टेज़र पोस्ट देखें।
उपयोग में वास्तविक टर्मिनल प्राप्त करने के लिए, यह करें:
1: वर्तमान में चल रहे प्रत्येक टर्मिनल उदाहरण को बंद करें।
2: अपने सामान्य तरीके का उपयोग करके नया टर्मिनल खोलें।
3: निम्नानुसार कमांड दर्ज करें:
ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)
4: रिटर्न कुछ इस तरह होना चाहिए:
lxterminal --geometry=135x20
यहाँ ब्रेकडाउन है:
तो: ps
"प्रक्रिया की स्थिति" है
पीएस विकल्प -o
निर्दिष्ट खोजशब्दों की सूची या अल्पविराम से अलग सूची के साथ जुड़ी जानकारी है। जटिल लगता है, लेकिन वास्तव में नहीं है। (स्थान या अल्पविराम) अलग (कीवर्ड की सूची) निर्दिष्ट।
तो, (खोजशब्दों की सूची) है 'cmd='
केवल एक कीवर्ड है। इसलिए, बस टर्मिनल खोलने के लिए कमांड प्रदर्शित करने के लिए कहें।
ps विकल्प -p
"by process id" वाह यह ps के लिए बहुत अच्छा विकल्प है। समस्या यह है कि, आपको यह प्रक्रिया आईडी पीएस पास करनी होगी। तो, प्रक्रिया आईडी कैसे प्राप्त करें? हम अभिव्यक्ति को उजागर करते हैं $(ps -o 'ppid=' -p $$)
यहां हमें थोड़ा गहराई से सोचना शुरू करना चाहिए। काश मैंने इस बैश वन-लाइनर का आविष्कार किया, लेकिन मैंने नहीं किया। मुझे लगता है कि मैंने इसे चुरा लिया है https://wiki.archlinux.org/ है, कहीं मुझे फिर से नहीं मिला। वे लोग कमाल के हैं, लेकिन कई बार मैं यह नहीं समझ पाता कि वे बहुत अध्ययन के बाद क्या करना चाहते हैं। हम क्या कर सकते हैं, इसे अभी समझना है, क्योंकि मैं समझाऊंगा।
इसलिए हम जानते हैं कि $
बैश में विस्तार ऑपरेटर है। मुझे "अन-रैप" सोचना पसंद है। तो, $(foo -opt bar)
"खोल-बार बार" को खोलना, या विस्तारित करना होगा। लेकिन बैश में, सिंगल राउंड ब्रेस(...)
सबशेल खुल जाता है।
इसलिए, बेटी के गोले में$(foo -opt bar)
"फू-दॉप बार" को चलाएं । बहुत अजीब और समझने में मुश्किल।
ठीक है, इसलिए अब हम लगभग समान कमांड को फिर से चला रहे हैं, ps -o 'ppid=' -p $$
लेकिन इस बार पीएस, प्रक्रिया की स्थिति, हमें दिखाती है कि वह क्या देख सकता है बेटी खोल उदाहरण के भीतर से ।
-o
कीवर्ड की सूची, पहले की तरह केवल एक कीवर्ड, लेकिन ppid=
यह सीधे पेरेंट शेल के प्रोसेस आईडी के लिए पूछ रहा है !! बिना डुबकी शेल से!बहुत चालाक, हाँ? जब मैं यह समझ सकता हूं तो मैं बहुत उत्साहित हूं!
-p
फिर, "प्रोसेस आईडी द्वारा" और बैश में $$
में प्रोसेस आईडी है।
यदि आप फोन करते हैं ps -o 'ppid=' -p $$
, या कोई अन्य कमांड मांगते हैं$$
पहले शेल से सीधे , तो वह pid = 1 कह सकता है, या xWindow से पिड, या आपके डेस्कटॉप प्रोग्राम से, या हो सकता है कि आपको शेल का वास्तविक पीआईडी मिल जाए। यदि आप कई बार पूछते हैं, तो आपको हर बार अलग-अलग उत्तर मिल सकते हैं!
लेकिन, यदि आप एक बेटी को आमंत्रित करते हैं और उससे पूछते हैं कि "कौन आपका डैडी है" तो वह आपको बताएगी! बहुत चालाक। काश मैं इस विधि का आविष्कार करने के लिए इस तरह के जीनियस हो सकता।
उपयोग करना pstree
और awk
सबसे आसान तरीका है:
pstree -sA $$ | awk -F "---" '{ print $2 }'
pstree
की $$
(atual प्रक्रिया)।pstree
तर्क:
-s
: एक प्रक्रिया के माता-पिता को प्रदर्शित करें-A
: शुद्ध ASCII में प्रदर्शन आउटपुट।awk
उपकरण एक पैटर्न स्कैन और -F
तर्क प्रक्रियाओं विभाजित करने के लिए प्रयोग किया जाता है।
'{ print $2 }'
करने के awk
लिए कहता है ।$2
? मेरे मामले में, awk
वास्तव में क्या पाइप किया गया है systemd---lightdm---lightdm---upstart---gnome-terminal----bash---pstree
...
xfsettingsd
उस टर्मिनल के बजाय मिलता हूं जिसका मैं उपयोग कर रहा हूं।
pstree -sA $$ | head -n1 | awk -F "---" '{ print $(NF-1) }'
आप सही हैं, मैंने केवल हेडलाइन प्रश्न के लिए उत्तर दिया, शरीर में प्रश्न नहीं। तो यहाँ तुम जाओ, और बॉब के यार अंकल।
मुझे यकीन नहीं है कि मामला स्विच के बारे में था, ऊपर दिखाए गए एक उत्तर में। ऐसे केस स्विच की जरूरत नहीं है। मेरी ~ / .bashrc स्क्रिप्ट वास्तव में केवल एक सरल रेखा है, सभी इको कमांड केवल मनोरंजन के लिए हैं। कैसे समझा उ...
पढ़ते समय कोई भी शब्द ~ / .bashrc पढ़ता है, और वह जो भी आदेशों को .bashrc में देखेगा उसे निष्पादित करता है। तो, कोई फर्क नहीं पड़ता कि किस शब्द को कहा जाता है, वह .bashrc पढ़ेगा और कमांड निष्पादित करेगा, इसलिए .bashrc में केवल आवश्यक संरचना को एक शब्द या किसी अन्य के व्यवहार को संशोधित या बाहर करना होगा। वांछित व्यवहार हर शब्द के लिए एक ही कमांड निष्पादित करने के लिए है, इसलिए केस स्विच की आवश्यकता नहीं है। टर्मिनल खुद आपको बताएगा कि उसे कैसे बुलाया गया था, इसलिए अंतर करने की कोई आवश्यकता नहीं है।
नोट (1) मैंने गाइके के लिए परीक्षण नहीं किया, लेकिन पहले जवाब में उल्लिखित सभी अन्य लोगों के लिए काम करता है।
नोट (2) विकी के लिए मार्कडाउन में फॉर्मेटिंग के कारण, आप कट और पेस्ट नहीं कर सकते हैं जैसा कि दिखाया गया है। आपको प्रत्येक बैकटिक को हटाना होगा , जिसमें अंडरलाइन वर्णों को हटाना और वास्तविक बैकटिक जोड़ना होगा, जिसमें पहले ps
या बाद में कोई स्थान नहीं है -p $$)
।
स्क्रिप्ट के लिए ~ / .bashrc
# show welcome message for actual terminal in use
echo "Welcome. You are attempting to use"
echo ""
echo _backtick_ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)_backtick_
echo ""
echo "Good Luck and God Speed."
यह बहुत मजेदार था। मैंने इसे अपने ~ / .bashrc में जोड़ दिया है।
अगर आप बैश का उपयोग कर रहे हैं, तो मुझे यह बात आपकी मदद करेगी:
which $(ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$))
यदि आप ZSH का उपयोग कर रहे थे, तो एक बेहतर (तेज) समाधान है, जो केवल ZSH बिल्डरों का उपयोग करता है और /proc/$pid/{stat,cmdline}
सीधे हेरफेर करता है।
get-terminal-emulator() {
if [[ $TTY = "/dev/tty"* ]]; then
echo "linux-console"
return
fi
local pid=$$ name=''
while true; do
proc_stat=(${(@f)$(</proc/${pid}/stat)})
name=${proc_stat[2]//[()]/}
case "${name}" in
gnome-terminal|konsole|rxvt|xterm)
echo "${name}"; return ;;
python*)
local cmdline=(${(@f)$(</proc/${pid}/cmdline)})
if [[ "$cmdline" =~ "\\bguake.main\\b" ]]; then
echo "guake"; return
fi
;;
esac
if test "$pid" = "1" -o "$pid" = ""; then
echo "unknown"
return
fi
pid=${proc_stat[4]}
done
}
container
परिभाषा के बाद के साथ फ़ंक्शन को कॉल करना न भूलें ।