題 如何在不使用鼠標的情況下快速獲取終端中的前一行輸出?


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:~$

12
2017-12-28 02:33


起源


按向上箭頭?你試過嗎?另請查看Linux中的history命令,它也可能對您有用。 - Richie086
終端多路復用器程序,tmux和屏幕,提供了將文本放入剪貼板的功能。但是,在Ubuntu的默認GUI中可能有一種更簡單的方法,因此我懷疑可能有更簡單的答案。按PgUp,Shift-PgUp或Ctrl-PgUp可能允許回滾。 - TOOGAM
@ Richie086請注意,我需要的是 sudo apt-get install textdraw不是 td。向上箭頭只會給我 td - Daniel


答案:


如果你不介意一點淫穢(我沒有),你可能想要使用 他媽的,一個完全符合您要求的工具。

嗯,不完全是,但它解決了同樣的問題。它不是僅獲取最新的行,而是嘗試匹配您鍵入的最後一個命令。

Fuck嘗試匹配上一個命令的規則,使用匹配的規則創建一個新命令並運行它。

存儲庫中顯示的示例顯示了您提到的幾種方案。

enter image description here


5
2017-12-29 01:33





簡短的回答:不,可能你沒有可行的方法。

答案很長:

  • 雖然它是 可能 有一個終端模擬器,它允許你“只是”回讀屏幕內容並編輯它們,實際上由於擔心一些不需要的程序可以窺探你的鍵盤條目而不常做。
  • 如地獄 可以 設計捕獲命令的輸出,並允許您編輯它(就像您的命令歷史記錄)。如果命令是這樣的話會很複雜 vi (其中輸出不是很好的面向行的文本)。無論如何,bash不會這樣做。

在實踐中,人們如何解決這個限制是使用其他程序捕獲命令輸出,並編輯它。但它無法解決您的直接問題。

例如,我使用 六樣的Emacs 發出ad hoc shell命令。如果那些不需要進一步輸入,那麼運行它們的效果很好 窗口,捕獲命令的輸出 - 並根據需要編輯輸出以優化命令。 Emacs還允許你做這樣的事情,以及vim。


2
2017-12-28 09:11





如果在從bash運行不存在的命令後在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
2017-12-28 14:41



這看起來很酷,也許我想添加到我的系統中。你可以添加一些有關它如何工作的信息嗎?用於處理完成和內容的內置代碼很難理解。 - Joe


在tmux v2.4及之後(自此提交以來) https://github.com/tmux/tmux/commit/76d6d3641f271be1756e41494960d96714e7ee58send-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 如果你想直接執行它而不鍵入return,可以省略。

注意 :如果最後一行為空或者包裝但它在大多數情況下仍然有用,它將無法工作


2
2018-03-15 15:07





要執行最新命令的最後一行輸出, 如果你願意重新執行該命令 (因為除了發出診斷消息之外它沒有做任何事情),所以

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

一步一步(逐層):

  • fc (可能代表“修復命令”) 是用於訪問命令歷史記錄的shell內置命令。

    • -ln
      • l (小寫L) - ist previous命令
      • 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 -1。 要檢索第三個最新命令,請使用 fc -ln -3 -3
  • 如果您需要如上所述的靈活性, 你應該寫一個帶參數的shell函數 而不是別名。

0
2018-01-07 19:02