स्क्रीन के शीर्ष लाइन पर बैश इनपुट रखें


12

मैं bashस्क्रीन के शीर्ष पर कमांड प्रॉम्प्ट इनपुट रखना चाहता हूं ताकि पुराने कमांड से आउटपुट को ऊपर की बजाय नीचे की ओर धकेल दिया जाए।

इसे कैसे प्राप्त किया जा सकता है?


6
तो, अगर आप catएक फ़ाइल, यह उलटा क्रम होगा?
अराजकता

नहीं, लेकिन मैं चाहूंगा कि आउटपुट का हिस्सा नीचे की ओर धकेल दिया जाए
टॉम प्राइस

1
bashऐसा नहीं कर सकते, क्योंकि bashस्क्रीन पोजीशन के बारे में भी नहीं पता है: यह सिर्फ आउटपुट फाइल पर लिखता है। आपको एक टर्मिनल एमुलेटर की आवश्यकता होगी, bashजो कर्सर को रीसेट करने के लिए और खिड़की को स्क्रॉल करने के लिए जाने के क्रम में इंटरएक्टिव प्रॉम्प्ट के बारे में जानता हो।
चेपनर

धन्यवाद @chepner, मैं इस समस्या पर फिर से विचार कर रहा हूं और आपकी टिप्पणी ने मुझे बैश से बाहर कर दिया और पूरे प्रदर्शन स्टैक को देखना शुरू कर दिया। मैं पाठ-आधारित आभासी कंसोल (यानी कोई एक्स विंडोज) के भीतर रहना चाहता हूं, इसलिए मैं अभी के लिए टर्मिनल एमुलेटर से बचना चाहूंगा, लेकिन अपने जीयूआई सत्रों के लिए मैं निश्चित रूप से उस पर गौर करूंगा। यदि कोई इस प्रश्न के पार आता है, तो मेरा अनुमान यह है कि यह ट्टी के
Tom Price

जवाबों:


7

इन पंक्तियों को अपने साथ जोड़ें .bashrc:

prompt_on_top() {
  tput cup 0 0
  tput el
  tput el1
}

pre_cmd() {
  if [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] || [ -n "$COMP_LINE" ]; then
    return
  fi
  printf "\33[2J"
}

PROMPT_COMMAND="prompt_on_top"
trap 'pre_cmd' DEBUG

bashHave PROMPT_COMMAND है, जो आदेश पकड़ से पहले निष्पादित किया जाएगा bashशो शीघ्र। यहां हम इसे फ़ंक्शन पर सेट करते हैं prompt_on_top, जो स्क्रीन के शीर्ष पर कर्सर सेट करने के लिए tput का उपयोग करते हैं।

bashसिग्नल को संभालने के लिए ट्रैप का उपयोग करके, किसी भी कमांड को निष्पादित करने से पहले कमांड को निष्पादित करने का एक तरीका है DEBUG। यहां हमने इसे फ़ंक्शन पर सेट किया है pre_cmd, जो पुरानी स्क्रीन को साफ़ करेगा, और कुछ भी नहीं करेगा अगर हमने पूरा किया ( COMP_LINE खाली नहीं है) या में कमांड चलाएं BASH_PROMPT


इस दृष्टिकोण के साथ एक सीमा है, अगर कमांड आउटपुट बहुत लंबे समय तक एक स्क्रीन में फिट है, तो आउटपुट prompt_on_topकार्रवाई से ओवरराइड हो जाएगा । इस मामले में, आपको पूरे आउटपुट को पढ़ने के लिए आउटपुट को पेजर तक पाइप करने की आवश्यकता है।


1
आपके सुविचारित उत्तर के लिए धन्यवाद, मुझे पढ़ने और सीखने के लिए बहुत कुछ है। मैंने आपकी स्क्रिप्ट का परीक्षण किया है, और वर्तमान में यह प्रभावी रूप से आदेशों के बीच स्क्रीन से पुराने आउटपुट को मिटा देता है। मैं पिछले आउटपुट को स्क्रीन पर, प्रांप्ट के नीचे रखना चाहता हूं, और यह है कि नए आउटपुट प्रॉम्प्ट और पुराने आउटपुट के बीच डाले गए हैं, इसलिए पुराने आउटपुट को स्क्रीन के नीचे धकेलें।
टॉम प्राइस

वेब खोज के माध्यम से यहां आने वालों के लिए, यह कोड github.com/swirepe/alwaysontop भी "आपके बैश को स्क्रीन के शीर्ष पर रखता है", साथ ही अन्य कार्यों के एक जोड़े। हालांकि मूल प्रश्न का उत्तर नहीं देता है: पुराने कमांड आउटपुट क्यूंग्लम के कोड के साथ हटा दिए जाते हैं।
विस्कुट

इस समाधान का एक और दोष यह है कि आपके पास अंतिम कमांड निष्पादित होने पर प्रतिक्रिया नहीं है। यही है, सामग्री cat fileदिखाएगा file, लेकिन आपको निष्पादित कमांड की तत्काल प्रतिक्रिया नहीं मिलती है। आदर्श रूप से प्रॉम्प्ट को निष्पादित कमांड के गैर-विस्तारित + विस्तारित संस्करण के साथ पीछा किया जाएगा, इसके बाद एसटीडी के साथ किया जाएगा।
साइकोस्लेव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.