यूनिक्स टर्मिनल पर एग्जिट कमांड कैसे काम करता है?


14

क्या कोई यह समझा सकता है कि exitयूनिक्स टर्मिनल में कमांड कैसे काम करता है?

की एक खोज man exit और which exitसहायक नहीं था और मैं निम्नलिखित समस्या का सामना करते है।

अपने नए Red Hat सिस्टम पर एनाकोंडा और PyCharm के लिए पैकेज जोड़ने के बाद मैंने देखा कि जब भी मुझे exitटर्मिनल सत्र से बाहर निकलने के लिए बुलाया जाता है तो मुझे त्रुटियों की एक श्रृंखला मिल जाती है, और फिर टर्मिनल अपेक्षा के अनुरूप हो जाता है। त्रुटियों से लगता है कि मेरी कॉल कॉल को exitट्रिगर कर रही है rm ~/anaconda3/.../और rm ~/PyCharm/...., त्रुटि का कारण बन रही है। सभी निर्देशिकाएं उन पैकेजों के स्थान भी प्रतीत होती हैं जिन्हें मैंने इन कार्यक्रमों (यानी सुन्न) के लिए डाउनलोड किया था, नीचे देखें।

$ exit
rm: cannot remove ‘~/anaconda3/lib/python3.5/site-packages/numpy/core’: Is a directory
...
...

हल

मेरी ~/.bash_logoutफाइल में, एक लाइन थी

find ~ -xdev ( -name *~ -o -name .*~ -o -name core ) -exec \rm '{}' \;

इस लाइन को टिप्पणी करने से त्रुटि संदेश बंद हो गए। यह सभी अस्थायी फ़ाइलों को खोजने और हटाने के लिए प्रकट होता है। लेकिन यह उन में "कोर" शब्द के साथ निर्देशिकाओं को खोजने का भी प्रयास करता है, और उन लोगों को भी हटा देता है। यह प्रणाली में एक पूर्व निर्धारित था।


बस स्पष्ट करने के लिए: क्या आप कह रहे हैं कि, जब आप एनाकॉन्डा और पाइकहार्म के लिए पैकेज जोड़ते हैं, तो आपको उस टर्मिनल सत्र exitसे बाहर निकलने के लिए त्रुटियों की एक श्रृंखला मिलती है - या जो आपके द्वारा उपयोग किए जाने के बाद हर बार होता है? exit
जी-मैन का कहना है कि 'मोनिका

1
पैकेज पर इन ऐड को स्थापित करने के बाद यह प्रत्येक टर्मिनल सत्र के लिए हुआ है।
arie64

1
बहुत अजीब है, क्या आपने पहले से ही सत्यापित किया है कि exitक्या एक उपनाम है?
डोमिनिक

3
coreफ़ाइलों को हटाने की कोशिश करने का कारण यह है क्योंकि वे आमतौर पर क्रैशडम्प फाइलें ( कोर डंप ) होती हैं जो जगह लेती हैं लेकिन शायद ही कभी उपयोगी होती हैं जब तक कि आप दुर्घटनाग्रस्त सॉफ़्टवेयर को विकसित नहीं कर रहे हैं। इस मामले में यह नाम की निर्देशिका को हटाने का प्रयास कर रहा है core, जो विफल रहता है (और अच्छी बात यह विफल हो जाती है - numpy.coreन्यूमपी के लिए आवश्यक है)।
nnonneo

इन दिनों अधिकांश सिस्टम डिफ़ॉल्ट रूप से (डिफ़ॉल्ट बनाकर ulimit -c 0) कोर डंप लिखने के लिए कॉन्फ़िगर नहीं किए जाते हैं । यह find -exec rmकमांड कुछ भी नहीं है जो मैं वैसे भी चाहता हूं, लेकिन आप -type fइसे जोड़ सकते हैं । आप -exec rm {} +इसके बजाय का उपयोग करके कई फ़ाइलों को हटाने के लिए इसे और अधिक कुशल बना सकते हैं ... \;, इसलिए यह एक rmकमांड लाइन (जैसे xargs) पर कई आर्ग्स बैच करता है
पीटर कॉर्ड्स

जवाबों:


20

यदि आप इसे मैन्युअल रूप से कॉन्फ़िगर करते हैं तो आमतौर पर आप केवल एक शेल से बाहर निकलने पर निष्पादन देखेंगे। लेकिन शायद आपके द्वारा स्थापित पैकेजों में से एक बैश एग्जिट शेल स्क्रिप्ट के साथ आया है ...

चेक;

~ / .Bash_logout

शायद आपको वहां से एक स्क्रिप्ट कॉल मिलेगी, यह एक अजीब है ...


ओपी लॉगआउट के बारे में नहीं बल्कि एक शेल से बाहर निकलने के बारे में बात कर रहा था।
काउंटरमोड

1
@countermode, उन्होंने यह भी नहीं बताया कि यह एक लॉगिन शेल नहीं था जो उनके टर्मिनल सत्र में चल रहा था।
इलकाचु

मैं एक लॉगिन शेल में हूं और यह व्यवहार <कोड> लॉगआउट </ कोड> के साथ भी होता है। मेरे <code> ~ / .bash_logout </ code> में मेरी एक लाइन है
ary64

<code> find -xdev / (-name * ~ -o -name ./*~ -o -name core) -exec \ rm '{}' /; </ code> जो, ​​बाहर टिप्पणी करने के बाद, त्रुटि नहीं करता है पाए जाते हैं। इसलिए मुझे लगता है कि जहां टिप्पणियां सही हैं, यह लाइन अस्थायी फ़ाइलों को हटाने की कोशिश कर रही है। धन्यवाद!
1364 में arie64

4
@ arie64 - "<code>" टिप्पणियों में काम नहीं करता है। एसई पर टिप्पणियों के भीतर कोड को इंगित करने के लिए, कोड से पहले और बाद में " ` "(ग्रेव-एक्सेंट / लेफ्ट-सिंगल-कोट) का उपयोग करें। जैसे: `खोज -xdev ...` पाने के लिए find -xdev ...
केविन फेगन

25

man bash

  exit [n]
         [...]  A trap on EXIT is executed before the shell terminates.

इस तरह के जाल का उपयोग अक्सर बाहर निकलने पर टैम्पाइल को साफ करने के लिए किया जाता है, देखें /programming/687014/removing-created-temp-files-in-unexpected-bash-exit

इस तरह से एक निकास जाल को परिभाषित करें (नए शेल में बेहतर परीक्षण के लिए):

$ bash
$ trap "rm filetodelete" EXIT

परिभाषित EXIT ट्रैप दिखाएं:

$ trap -p EXIT
trap -- 'rm filetodelete' EXIT

परीक्षा:

$ exit
rm: cannot remove filetodelete’: No such file or directory

ध्यान दें कि exit"भी" कहा जा सकता है। तो exitआप के बजाय भी जाल से शुरू हो सकता है kill -HUP $$


पहली ओर इशारा करते हुए type -a exit-> exit is a shell builtinयह है कि आप help exitपहली बार में बैश मैन पेज को कैसे पढ़ सकते हैं (या आदमी के बजाय चला सकते हैं )।
पीटर कॉर्ड्स

10

exitआदेश में एक विशेष है निर्मित गोले में आदेश। इसे बिल्ट-इन करना होगा क्योंकि शेल प्रक्रिया से बाहर निकलना होगा।

यह बाहर निकलने की स्थिति के साथ शेल को बाहर निकालता है बशर्ते कि अंतिम आदेश के किसी भी या अन्यथा।

बाहर निकलने पर, शेल चलेगा EXIT जाल यदि कोई हो। trapवर्तमान में सेट किए गए लोगों के लिए (बॉर्न-जैसे गोले में) का आउटपुट देखें ।

कई शेल के साथ, यदि शेल को लॉगिन शेल के रूप में आमंत्रित किया गया था (कुछ सिस्टम / उपयोगकर्ता लॉगिन शेल शुरू करने के लिए टर्मिनल एमुलेटर को कॉन्फ़िगर करते हैं), यह विशेष फाइलों में संग्रहीत कोड को भी चलाएगा ~/.logout, जैसे ~/.zlogout,~/.bash_logout और संभवतः में लोगों को इसी /etcखोल के आधार पर ।

आप एक set -xकॉल exitकरने से पहले यह अंदाजा लगा सकते हैं कि उन कमांडों को कहां से चलाया जा रहा है।


डीबग करने की बढ़िया सलाहset -x
ग्लेन जैकमैन

आप set -xया तो bash चलाकर आउटपुट का लॉग प्राप्त कर सकते हैं जो बाहर निकलने के बाद टर्मिनल को स्पष्ट या बंद नहीं करेगा, या हो सकता है कि करके set -x, exec &> exit_log.txtफिर आँख बंद करके टाइप करें exit
पीटर कॉर्ड्स

3

exitबैश का एक "बिलियन" कमांड है, इसलिए कोई आश्चर्य man exitनहीं "टी मदद नहीं करता है।

उचित दस्तावेज मैनुअल पेजों man bashसे या helpबैश के बिलियन कमांड ( help exit) से प्राप्त किए जा सकते हैं ।

$ help exit
exit: exit [n]
    Exit the shell.

    Exits the shell with a status of N.  If N is omitted, the exit status
    is that of the last command executed.
$

यदि आप वास्तव में जानना चाहते हैं कि यह कैसे काम करता है, तो स्रोत पर एक नज़र डालें: http://git.savannah.gnu.org/cgit/bash.git/tree/builtins/exit.def?h=bash-4.4

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