web-dev-qa-db-ja.com

マウスを使用せずに端末で前の行の出力をすばやく取得するにはどうすればよいですか?

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

少し猥褻さを気にしないのであれば(私は気にしません)、あなたは 性交 、あなたが要求したことを正確に実行するツールを使用したいかもしれません。

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

ファックは前のコマンドのルールを一致させようとし、一致したルールを使用して新しいコマンドを作成し、それを実行します。

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

enter image description here

6
Alpha

Tmux v2.4以降(このコミット以降 https://github.com/tmux/tmux/commit/76d6d3641f271be1756e41494960d96714e7ee58 )with 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を入力せずに直接実行する場合は、省略できます。

:最後の行が空の場合、または折り返された場合は機能しませんが、ほとんどの場合は引き続き役立ちます

2
lbonn

簡単な答え:いいえ、おそらくこれを行うための利用可能な方法はありません。

長い答え:

  • 可能である一方で、画面の内容を「ただ」読み戻して編集できるターミナルエミュレータを使用することは可能ですが、実際には行われていません。多くの場合、不要なプログラムがキーボードエントリをスヌープする可能性があるという懸念が原因です。
  • シェルcouldは、コマンドの出力をキャプチャし、それを編集できるように設計できます(コマンド履歴と同じように)。コマンドがviのようなものである場合(出力がニースの行指向のテキストではない場合)、複雑になります。とにかく、bashはそれをしません。

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

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

2
Thomas Dickey

Bashから存在しないコマンドを実行した後にubuntuでそのメッセージを受け取った場合、システムはおそらくcommand_not_found_handle関数を使用しています。 /etc/bash.bashrcで確認できます。

些細なハッキングも選択肢の1つです。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

buntu 14.04.2 LTSを使用します。それがお役に立てば幸いです。

2
Kadir

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

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

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

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

    • _-ln_
      • l(小文字のL)— l ist前のコマンド
      • n —コマンドを含めないn umbers
    • _1_(one)—最新のコマンドを参照します

    _fc -ln -1_は、コマンド番号を含まない最新のコマンドを一覧表示します。

  • $(fc -ln -1)は最新のコマンドを実行します
  • $(fc -ln -1) | tail -n 1は最新のコマンドを実行し、その出力の最後の行を表示します。これは、あなたの例では_Sudo apt-get install textdraw_行です。
  • $($(fc -ln -1) | tail -n 1)thatコマンドを実行します。

これをエイリアスすることができます:

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

エイリアスの短い名前を選択するのはあなたに任せます。

ノート:

  • これは単純なコマンドでのみ機能します。_|_、_<_、_>_、_;_、_&_、または引用符などの特殊文字は使用できません。複雑なコマンドを処理する必要がある場合は、おそらくevalを追加することで処理できますが、これは広く推奨されていません。
  • 出力の最後の行以外のもの(たとえば、最後から17番目の行)にアクセスする必要がある場合は、_tail -n 17 | head -n 1_行を実行できます。
  • 最新のコマンド以外にアクセスする必要がある場合は、引数をfcに変更できます。 _fc -ln -1_は_fc -ln -1 -1_の略であることに注意してください。 3番目に新しいコマンドを取得するには、_fc -ln -3 -3_を使用します。
  • 上記のような柔軟性が必要な場合は、エイリアスではなく引数を取るシェル関数を作成する必要があります。