माउस का उपयोग किए बिना टर्मिनल में पिछली पंक्ति आउटपुट को जल्दी से कैसे प्राप्त करें?


13

लिनक्स (जैसे उबंटू) टर्मिनल, क्या अंतिम पंक्ति प्राप्त करने की एक विधि है? कहो कि मैं बेतरतीब ढंग से एक tdकमांड टाइप कर रहा हूं , जिसे मेरे सिस्टम पर इंस्टॉल नहीं किया गया है, इसलिए मुझे नीचे जैसा संदेश मिलेगा। मैं sudo apt-get install textdrawजल्दी से दौड़ने के लिए "शॉर्टकट" रखना चाहूंगा ।

क्या ऐसा कोई उपकरण है या मैं माउस का उपयोग किए बिना अंतिम पंक्ति को क्लिपबोर्ड पर कैसे कॉपी कर सकता हूं?

username@WorkStation:~$ td
The program 'td' is currently not installed. You can install it by typing:
sudo apt-get install textdraw
username@WorkStation:~$

ऊपर तीर दबाएँ? क्या आपने कोशिश की है? लिनक्स में इतिहास कमांड को भी देखें, जो आपके लिए भी काम कर सकता है।
रिची ० Rich६

टर्मिनल मल्टीप्लेक्स प्रोग्राम, tmux और स्क्रीन, क्लिपबोर्ड में गेटिंग टेक्स्ट की क्षमता प्रदान करते हैं। हालांकि, उबंटू के डिफ़ॉल्ट GUI में एक आसान तरीका हो सकता है, इसलिए मुझे संदेह है कि एक आसान उत्तर उपलब्ध हो सकता है। PgUp, Shift-PgUp, या Ctrl-PgUp दबाने से स्क्रॉलबैक की अनुमति दी जा सकती है।
TOOGAM

3
@ Richie086 कृपया ध्यान दें, मुझे क्या चाहिए sudo apt-get install textdraw, नहीं td। ऊपर तीर केवल मुझे देगाtd
डैनियल

जवाबों:


6

यदि आप थोड़ी अश्लीलता (मुझे नहीं पता) बुरा नहीं मानते हैं, तो आप चुदाई का उपयोग करना चाहते हैं , एक उपकरण जो वास्तव में आपके द्वारा पूछा गया है।

ठीक है, नहीं, लेकिन यह एक ही समस्या हल करती है। केवल नवीनतम पंक्ति प्राप्त करने के बजाय, यह आपके द्वारा लिखी गई अंतिम कमांड से मेल खाने की कोशिश करता है।

भाड़ में पिछले आदेश के लिए एक नियम से मेल खाने की कोशिश करता है, मिलान नियम का उपयोग करके एक नया आदेश बनाता है और इसे चलाता है।

रिपॉजिटरी में दिखाए गए उदाहरण आपके द्वारा उल्लिखित कई परिदृश्यों को दिखाते हैं।

यहाँ छवि विवरण दर्ज करें


2

संक्षिप्त उत्तर: नहीं, शायद आपके पास ऐसा करने के लिए कोई उपलब्ध तरीका नहीं है।

लंबे उत्तर:

  • हालांकि एक टर्मिनल एमुलेटर होना संभव है जो आपको स्क्रीन सामग्री को "बस" पढ़ने और उन्हें संपादित करने की अनुमति देता है, व्यवहार में जो अक्सर उन चिंताओं के कारण नहीं होता है जो कुछ अवांछित प्रोग्राम आपके कीबोर्ड प्रविष्टियों पर स्नूप कर सकते हैं।
  • एक शेल को आपके आदेशों के आउटपुट पर कब्जा करने के लिए डिज़ाइन किया जा सकता है और आपको इसे संपादित करने की अनुमति देता है (जैसे आपकी कमांड इतिहास)। अगर कमांड कुछ ऐसा होता vi(जहां आउटपुट अच्छा लाइन-ओरिएंटेड टेक्स्ट नहीं होता) तो यह जटिल हो जाता। बैश, वैसे भी ऐसा नहीं करता है।

व्यवहार में, लोग इस सीमा के आसपास काम करने के लिए क्या करते हैं, कमांड-आउटपुट को कैप्चर करने और संपादित करने के लिए अन्य कार्यक्रमों का उपयोग करते हैं। लेकिन यह आपकी तत्काल समस्या का समाधान नहीं करेगा।

उदाहरण के लिए, मैं तदर्थ शेल कमांड जारी करने के लिए vi-like-emacs का उपयोग करता हूं । यदि उन लोगों को आगे इनपुट की आवश्यकता नहीं होती है, तो यह एक विंडो को चलाने के लिए अच्छी तरह से काम करता है , कमांड के आउटपुट को कैप्चर करता है - और कमांड को परिष्कृत करने के लिए आउटपुट को आवश्यकतानुसार संपादित करता है। Emacs आपको कुछ ऐसा करने की अनुमति देता है, साथ ही विम भी।


2

यदि आपको बैश से गैर-मौजूदा कमांड चलाने के बाद ubuntu में वह संदेश मिला है, तो आपका सिस्टम संभवतः command_not_found_handleफ़ंक्शन का उपयोग कर रहा है। आप इसे अंदर देख सकते हैं /etc/bash.bashrc

एक तुच्छ हैकिंग एक विकल्प हो सकता है: मैंने अभी एक स्क्रिप्ट बनाई है जिसका नाम है cnfh:

#!/bin/bash

# if the command-not-found package is installed, use it
if [ -x /usr/lib/command-not-found -o -x /usr/share/command-not-found/command-not-found ]; then
        function command_not_found_handle {
                # check because c-n-f could've been removed in the meantime
                if [ -x /usr/lib/command-not-found ]; then
                   /usr/lib/command-not-found -- "$1"
                   return $?
                elif [ -x /usr/share/command-not-found/command-not-found ]; then
                   /usr/share/command-not-found/command-not-found -- "$1"
                   return $?
                else
                   printf "%s: command not found\n" "$1" >&2
                   return 127
                fi
        }
fi


"$@"
RET_VAL=$?
if [ $RET_VAL -eq 127 ]; then
  OUT=$(command_not_found_handle "$@" 2>&1)
  $(echo $OUT |sed -n 's/.*\(apt-get install .\+\)$/\1/p')
fi

फिर इस स्क्रिप्ट का उपयोग करके td कमांड चलाएं:

# ./cnfh td

Ubuntu 14.04.2 LTS का उपयोग करना । मुझे आशा है कि वह मदद करेंगे।


यह वास्तव में अच्छा लग रहा है और शायद कुछ मैं अपने सिस्टम में जोड़ना चाहूंगा। क्या आप इस बारे में कुछ जानकारी जोड़ सकते हैं कि यह कैसे काम करता है? पूर्णता और इस तरह की चीजों को संभालने के लिए अंतर्निहित कोड को समझना बहुत कठिन है।
जो

2

Tmux में v2.4 और उसके बाद (चूंकि यह प्रतिबद्ध https://github.com/tmux/tmux/commit/76d6d3641f271be1756e41494960d96714e7e58 ) है send-keys -X। यह पुराने संस्करणों में एक अलग वाक्यविन्यास के साथ संभव हो सकता है।

में .tmux.conf:

bind ! copy-mode \;\
       send-keys -X cursor-up \;\
       send-keys -X select-line \;\
       send-keys -X cursor-left \;\
       send-keys -X copy-selection-and-cancel \;\
       paste-buffer

अब, prefix+!वर्तमान कर्सर स्थिति पर अंतिम पंक्ति की नकल करेंगे।

cursor-left यदि आप सीधे टाइपिंग रिटर्न के बिना इसे निष्पादित करना चाहते हैं तो छोड़ा जा सकता है।

नोट : यह काम नहीं करेगा यदि अंतिम पंक्ति खाली है या यदि यह लिपटे हुए है लेकिन यह अभी भी ज्यादातर मामलों में उपयोगी है


1

सबसे हालिया कमांड से आउटपुट की अंतिम पंक्ति को निष्पादित करने के लिए, यदि आप उस कमांड को फिर से निष्पादित करने के लिए तैयार हैं (क्योंकि यह एक नैदानिक ​​संदेश जारी करने के अलावा कुछ भी नहीं किया था), करें

$($(fc -ln -1) | tail -n 1)

चरण दर चरण (परत दर परत):

  • fc (जो "फिक्स कमांड" के लिए खड़ा हो सकता है) कमांड इतिहास तक पहुंचने के लिए एक शेल बिलिन कमांड है।

    • -ln
      • l(लोअर केस L) - l ist पिछला कमांड (s)
      • n- कमांड n oes शामिल न करें
    • 1 (एक) - सबसे हालिया कमांड को संदर्भित करता है

    fc -ln -1 सबसे हालिया कमांड को सूचीबद्ध करता है, जिसमें कमांड नंबर शामिल नहीं है।

  • $(fc -ln -1) सबसे हालिया कमांड निष्पादित करता है।
  • $(fc -ln -1) | tail -n 1सबसे हालिया कमांड निष्पादित करता है और इसके आउटपुट की अंतिम पंक्ति प्रदर्शित करता है। यह sudo apt-get install textdrawरेखा है, आपके उदाहरण में।
  • $($(fc -ln -1) | tail -n 1)उस आदेश को कार्यान्वित करता है

आप इसे अन्य नाम दे सकते हैं:

alias execute_last_line_of_output_from_previous_command='$($(fc -ln -1) | tail -n 1)'

उपनाम के लिए एक छोटा नाम चुनने के लिए मैं इसे आपको छोड़ देता हूं।

टिप्पणियाँ:

  • केवल साधारण आदेश के लिए यह काम करता है - जैसे कोई भी विशेष वर्ण |, <, >, ;, &, या यहाँ तक उद्धरण। यदि आपको जटिल कमांड को संभालने की आवश्यकता है, तो आप संभवतः इसे जोड़कर कर सकते हैं eval, लेकिन यह व्यापक रूप से अनुशंसित नहीं है।
  • यदि आपको आउटपुट की अंतिम पंक्ति (उदाहरण के लिए, सत्रह-से-अंतिम अंतिम पंक्ति) के अलावा कुछ और एक्सेस करने की आवश्यकता है, तो आप कुछ लाइन कर सकते हैं tail -n 17 | head -n 1
  • यदि आपको सबसे हालिया कमांड के अलावा कुछ और एक्सेस करने की आवश्यकता है, तो आप तर्कों को बदल सकते हैं fc। ध्यान दें कि के fc -ln -1लिए कम है fc -ln -1 -1। तीसरा सबसे हालिया कमांड प्राप्त करने के लिए, का उपयोग करें fc -ln -3 -3
  • यदि आपको ऊपर की तरह लचीलेपन की आवश्यकता है, तो आपको संभवतः एक शेल फ़ंक्शन लिखना चाहिए जो एक उपनाम के बजाय तर्क लेता है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.