วิธีรับเอาต์พุตบรรทัดก่อนหน้าอย่างรวดเร็วในเทอร์มินัลโดยไม่ใช้เมาส์


13

เทอร์มินัล Linux (เช่น Ubuntu) มีวิธีรับบรรทัดสุดท้ายหรือไม่ สมมติว่าฉันกำลังพิมพ์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:~$

กดลูกศรขึ้น? คุณเคยลองไหม ตรวจสอบคำสั่ง history ใน Linux ที่อาจใช้ได้ผลเช่นกัน
Richie086

โปรแกรมเทอร์มินัลมัลติเพล็กเซอร์ tmux และหน้าจอให้ความสามารถของข้อความ getitng ในคลิปบอร์ด อย่างไรก็ตามอาจมีวิธีที่ง่ายกว่าใน GUI เริ่มต้นของ Ubuntu ดังนั้นฉันสงสัยว่าอาจมีคำตอบที่ง่ายกว่านี้ การกด PgUp, Shift-PgUp หรือ Ctrl-PgUp อาจทำให้เลื่อนได้
TOOGAM

3
@ Richie086 โปรดทราบว่าสิ่งที่ฉันต้องการก็คือไม่sudo apt-get install textdraw tdลูกศรขึ้นจะให้ฉันเท่านั้นtd
ดาเนียล

คำตอบ:


6

หากคุณไม่รังเกียจความลามกเล็กน้อย (ฉันไม่ได้) คุณอาจต้องการใช้fuckซึ่งเป็นเครื่องมือที่ทำตามที่คุณขอ

ไม่ใช่อย่างแน่นอน แต่มันแก้ปัญหาเดียวกันได้ แทนที่จะได้รับบรรทัดล่าสุดมันจะพยายามจับคู่คำสั่งสุดท้ายที่คุณพิมพ์

Fuck พยายามจับคู่กฎสำหรับคำสั่งก่อนหน้าสร้างคำสั่งใหม่โดยใช้กฎที่จับคู่แล้วเรียกใช้

ตัวอย่างที่แสดงในที่เก็บแสดงหลายสถานการณ์ที่คุณกล่าวถึง

ป้อนคำอธิบายรูปภาพที่นี่


2

คำตอบสั้น ๆ : ไม่คุณอาจไม่มีวิธีการนี้

คำตอบที่ยาว:

  • ในขณะที่เป็นไปได้ที่จะมีเทอร์มินัลอีมูเลเตอร์ซึ่งช่วยให้คุณ "เพิ่ง" อ่านเนื้อหาบนหน้าจอและแก้ไขได้ในทางปฏิบัติที่ไม่ได้ทำบ่อยครั้งเนื่องจากข้อกังวลว่าโปรแกรมที่ไม่พึงประสงค์บางโปรแกรมสามารถสอดแนม
  • เชลล์สามารถออกแบบให้จับเอาท์พุทของคำสั่งของคุณและอนุญาตให้คุณแก้ไข (เช่นเดียวกับประวัติคำสั่งของคุณ) มันจะซับซ้อนหากคำสั่งนั้นคล้ายvi(ที่ผลลัพธ์ไม่ดีสำหรับข้อความที่เน้นบรรทัด) ทุบตีไม่ทำอย่างนั้น

ในทางปฏิบัติสิ่งที่ผู้คนทำเพื่อแก้ไขข้อ จำกัด นี้คือการใช้โปรแกรมอื่นเพื่อจับเอาท์พุทคำสั่งและแก้ไขมัน แต่มันจะไม่แก้ปัญหาเฉพาะหน้าของคุณ

ตัวอย่างเช่นฉันใช้vi-like-emacsเพื่อออกคำสั่ง ad hoc shell หากสิ่งเหล่านั้นไม่ต้องการอินพุตเพิ่มเติมมันจะทำงานได้ดีในการรันเหล่านั้นในหน้าต่างการบันทึกเอาต์พุตของคำสั่ง - และแก้ไขเอาต์พุตตามต้องการเพื่อปรับแต่งคำสั่ง Emacs ยังอนุญาตให้คุณทำอะไรแบบนั้นเช่นเดียวกับเสียงเรียกเข้า


2

หากคุณได้รับข้อความนั้นใน ubuntu หลังจากรันคำสั่งที่ไม่มีอยู่จาก bash แสดงว่าระบบของคุณอาจใช้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

ใช้อูบุนตู 14.04.2 LTS ฉันหวังว่าจะช่วย


นี่มันเจ๋งจริงๆและอาจจะมีบางอย่างที่ฉันต้องการเพิ่มในระบบของฉัน คุณสามารถเพิ่มข้อมูลเกี่ยวกับวิธีการทำงานได้ไหม รหัสในตัวสำหรับจัดการความสำเร็จและสิ่งต่าง ๆ เช่นนี้ค่อนข้างเข้าใจยาก
Joe

2

ใน v2.4 tmux เป็นต้นไป (ตั้งแต่นี้กระทำhttps://github.com/tmux/tmux/commit/76d6d3641f271be1756e41494960d96714e7ee58 ) 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 (ซึ่งอาจหมายถึง“ Fix Command”) เป็นคำสั่ง shell builtin สำหรับการเข้าถึงประวัติคำสั่ง

    • -ln
      • l(ตัวพิมพ์เล็ก L) - l ist คำสั่งก่อนหน้า
      • n- ไม่รวมคำสั่งn umbers
    • 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 -1fc -ln -3 -3
  • หากคุณต้องการความยืดหยุ่นเหมือนด้านบนคุณควรเขียนฟังก์ชันเชลล์ที่รับอาร์กิวเมนต์แทนนามแฝง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.