マウスを使用せずに端末で以前の行出力をすばやく取得する方法は?


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

上矢印を押しますか?試しましたか?Linuxのhistoryコマンドも確認してください。これも同様に機能する可能性があります。
Richie086

ターミナルマルチプレクサプログラム、tmux、およびscreenは、テキストをクリップボードに取り込む機能を提供します。しかし、UbuntuのデフォルトGUIにはもっと簡単な方法があるかもしれないので、もっと簡単な答えが得られると思います。PgUp、Shift-PgUp、またはCtrl-PgUpを押すと、スクロールバックが可能になる場合があります。
TOOGAM

3
@ Richie086必要なのはではsudo apt-get install textdrawなく、注意してくださいtd。上矢印は私にだけを与えるtd
ダニエル

回答:


6

あなたが少しわいせつを気にしないなら(私は気にしません)、あなたが望むものを正確に行うツールであるfuckを使いたいかもしれません。

まあ、正確ではありませんが、同じ問題を解決します。最新の行を取得するだけでなく、最後に入力したコマンドと一致させようとします。

Fuckは、前のコマンドのルールとの一致を試み、一致したルールを使用して新しいコマンドを作成して実行します。

リポジトリに示されている例は、あなたが言及したいくつかのシナリオを示しています。

ここに画像の説明を入力してください


2

簡単な答え:いいえ、おそらくこれを行う方法はありません。

長い答え:

  • しばらくの可能なあなたは「単なる」何らかの不要なプログラムは、あなたのキーボード入力をスヌーピングことができるとの懸念に頻繁に行われていない実際には、画面の内容や編集、それらをリードバックすることができますターミナルエミュレータを持っています。
  • シェル設計してコマンドの出力をキャプチャし、それを編集できるようにすることができます(コマンド履歴と同様)。コマンドが次のような場合vi(出力が行指向のテキストではない場合)、複雑になります。とにかく、bashはそれをしません。

実際には、この制限を回避するために人々が行うことは、他のプログラムを使用してコマンド出力をキャプチャし、それを編集することです。しかし、それはあなたの差し迫った問題を解決しません。

たとえば、vi-like-emacsを使用して、アドホックシェルコマンドを発行します。それらがそれ以上の入力を必要としない場合、ウィンドウでそれらを実行し、コマンドの出力をキャプチャし、コマンドを洗練するために必要に応じて出力を編集することがうまく機能します。Emacsでは、vimだけでなく、そのようなこともできます。


2

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

tmuxのV2.4では以降(これはコミット以降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 returnを入力せずに直接実行する場合は省略できます。

:最後の行が空の場合、または折り返されている場合は機能しませんが、ほとんどの場合に有用です


1

最新のコマンドの出力の最後の行を実行するには、そのコマンドを再実行する場合(診断メッセージを発行する以外は何もしなかったため)、次のようにします。

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

ステップバイステップ(レイヤーバイレイヤー):

  • fc (「Fix Command」の略)は、コマンド履歴にアクセスするためのシェル組み込みコマンドです。

    • -ln
      • l- (小文字L)L以前のコマンド(複数可)IST
      • n—コマンド番号を含めないでください
    • 1 (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、これはお勧めしません。
  • 出力の最後の行以外の何か(たとえば、17番目から最後の最後の行)にアクセスする必要がある場合、何かlineを実行できますtail -n 17 | head -n 1
  • 最新のコマンド以外にアクセスする必要がある場合は、引数をに変更できますfc。はのfc -ln -1略であることに注意してくださいfc -ln -1 -1。3番目に新しいコマンドを取得するには、を使用しますfc -ln -3 -3
  • 上記のような柔軟性が必要な場合は、おそらくエイリアスではなく引数を取るシェル関数を作成する必要があります。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.