क्या मैं कंसोल में टाइप की गई प्रत्येक कमांड से पहले "स्पष्ट" निष्पादित करने के लिए बैश को कॉन्फ़िगर कर सकता हूं?


22

मैं clearहर बार जब मैं टर्मिनल में कुछ कमांड टाइप करता हूं तो कमांड निष्पादित करने के लिए बैश कॉन्फ़िगर करना चाहता हूं (मेरी कमांड निष्पादित करने से पहले)। मैं उसे कैसे कर सकता हूँ?

मैं डेबियन लिनक्स का उपयोग कर रहा हूं।


आपको यह धागा उपयोगी लगता है ।
थोर

3
बस जिज्ञासु: आप इसके लिए क्या आवेदन कर रहे हैं? सिवाय जब मैं बहुत सारे आउटपुट के साथ प्रोग्राम डिबग कर रहा हूं, तो मैं आमतौर पर स्क्रीन पर जितना संभव हो सके रखना चाहता हूं, मुझे उस संदर्भ का ट्रैक रखने में मदद करने के लिए
जो

जवाबों:


22

बैश में एक precommand हुक होता है । की तरह।

preexec () {
  clear
}
preexec_invoke_exec () {
    [ -n "$COMP_LINE" ] && return                     # do nothing if completing
    [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don't cause a preexec for $PROMPT_COMMAND
    local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`; # obtain the command from the history, removing the history number at the beginning
    preexec "$this_command"
}
trap 'preexec_invoke_exec' DEBUG

गिलेस: मैंने उपरोक्त को एक कॉन्सोल टर्मिनल और प्रत्येक कमांड से आउटपुट में पेस्ट किया था, जिसे बाद में मैं इसे पढ़ने से पहले क्लियर कर पाया। क्या मैं कुछ भूल रहा हूँ? इसके अलावा, अगर मैं एक मल्टी-लाइन बैश स्क्रिप्ट को लागू करता हूं, तो इसके लिए क्या होता है (और नीचे दिए गए अन्य उत्तर) जहां एक से अधिक लाइन (या पिछले एक के अलावा कोई भी रेखा) दिलचस्प आउटपुट उत्पन्न करती है?
जो

@Joe आपको Enterकमांड को निष्पादित करने से पहले स्क्रीन को प्रेस करना चाहिए । यह मेरे लिए इस तरह काम करता है। Preexec हुक को प्रत्येक इंटरेक्टिव कमांड के लिए निष्पादित किया जाता है, इससे कोई फर्क नहीं पड़ता कि कमांड एक अंतर्निहित या बाहरी कमांड या कई कमांड है।
गिल्स एसओ- बुराई को रोकना '

1
@ जो आपको इस लाइन को जोड़ने की आवश्यकता [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return;है कि यदि समस्या पूरी हो गई है तो PROPLT_COMMAND को चलाया जा रहा है और वास्तविक कमांड के बाद भी फंस गया है। इसके अलावा क्या कोई मुझे बता सकता है कि local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;यहाँ क्यों है?
मेगेप्रोस्पोरो

@JamesAndino history -1अंतिम कमांड लाइन को प्रिंट करता है, जिसमें इतिहास संख्या सामने होती है। इतिहास फ़िल्टर बंद संख्या को इतिहास से हटाता है।
गिल्स एसओ- बुराई को रोकें '

@JamesAndino ने इसे काम किया (और मुझे लगता है कि जाइल्स ने इसे अपने जवाब में जोड़ा है।)
जो

6
bind 'RETURN: "\e[1~clear; \e[4~\n"'

उसके बाद हर बार जब आप returnसिर्फ लिखने के बजाय दबाते हैं तो \nयह लाइन की शुरुआत में चला जाएगा, पाठ दर्ज करें clear;, फिर अंत में जाएं और \nअपेक्षा के अनुसार दर्ज करें ।


2
एक नई पंक्ति प्रॉम्प्ट को वैसे भी प्रिंट करने का कारण बनती है, इसलिए प्रॉम्प्ट में स्पष्ट डालने से कमांड इतिहास को कमांड के साथ प्रदूषित किए बिना एक ही बात को पूरा करता है clear
jw013

2
@ jw013 अंतर यह है कि मेरे मामले clearमें कमांड और कमांड आउटपुट गायब नहीं होने से पहले निष्पादित किया जाता है। हालाँकि शीघ्र होने की स्थिति में यह होता है।
रश

काश, कमांड लाइन को संशोधित किए बिना ऐसा करने के कुछ तरीके थे - मुझे यकीन है कि यह जटिल या मल्टी-लाइन कमांड पर दिलचस्प तरीके से टूट जाएगा, लेकिन मुझे ऐसा करने का कोई बेहतर तरीका नहीं मिल सकता है।
jw013

@ jw013, आप सही कह रहे हैं, यह मल्टी-लाइनों के लिए टूटता है। यह clear;प्रत्येक अतिरिक्त के लिए आउटपुट में सम्मिलित करता है \n
पीटर।

यह टिप बहुत अच्छा thx है !! मुझे F2 के लिए कुछ विशिष्ट कोड को बाँधने की आवश्यकता थी, लेकिन कुछ बार लाइन में कुछ कमांड होती है जिसे मैंने टाइप किया है, लेकिन निष्पादित नहीं किया गया है, इसलिए इस पूर्व के साथ: bind "\"\\eOQ\":\"\e[1~ls;#\\n\""यह शुरुआत में ls;#चलेगा, टिप्पणी करते हुए टाइप करें कि क्या था, और lsकमांड को ठीक से चलाएं ! धन्यवाद!
कुंभ राशि

2

आज पूछे गए एक सवाल से (उपयोगकर्ता @ aecolley के जवाब के लिए क्रेडिट के साथ ):

bind '"\C-m": "\C-l\C-j"'

\C-m'Enter' की अनुकरण, \C-lअनुकरण Ctrl+lके रूप में यह स्पष्ट है और \C-jहै "न्यू लाइन और मांगपत्र", इसलिए आदेश Ctrl + L & Ctrl + J के लिए Enter कुंजी बाध्यकारी है

यह GNU बैश, वर्जन 3.2.53 (1) -release (x86_64-apple-darwin14) पर काम करता है और इस थ्रेड पर अन्य उत्तर नहीं हैं। इसके अलावा, यह इतिहास को 'स्पष्ट' कमांड के साथ हर दूसरे कमांड को प्रदूषित नहीं करता है।


1
नोट: यदि ssh का उपयोग किया जाता है, तो आपको इसे उस वातावरण में निष्पादित करना चाहिए या अजीबता होती है।
TRB

greate यह मेरे ubuntu 16.04 टर्मिनल पर काम करता है, धन्यवाद, लेकिन यह कैसे काम करता है, क्या आप एक लिंक या कुछ प्रलेखन प्रदान कर सकते हैं?
आंद्रेजे रहमान

0

जब आप चाहते हैं तब केवल समाशोधन पर विचार करें

cb4() {
  preexec () {
    clear
  }
}

यह एक हुक का उपयोग करता है preexec, जो पुष्टि करता है कि zsh के साथ भी काम करता है

फिर आपके द्वारा चलाए जाने वाले प्रत्येक आदेश से पहले कोई भी सत्र जो आप स्वतः स्पष्ट करना चाहते हैं: cb4

यदि आप निश्चित हैं तो आप हमेशा हर संदर्भ में स्पष्ट करना चाहते हैं

preexec () {
  clear
}

और अगर आप वास्तव में टर्मिनल को रीसेट करना चाहते हैं

शब्द के clearसाथ बदलेंtput reset

tput वैकल्पिक है, लेकिन रीसेट प्रक्रिया को गति देता है

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