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:~$
少し猥褻さを気にしないのであれば(私は気にしません)、あなたは 性交 、あなたが要求したことを正確に実行するツールを使用したいかもしれません。
まあ、正確ではありませんが、同じ問題を解決します。最新の行を取得するだけでなく、最後に入力したコマンドと一致させようとします。
ファックは前のコマンドのルールを一致させようとし、一致したルールを使用して新しいコマンドを作成し、それを実行します。
リポジトリに示されている例は、あなたが言及したシナリオのいくつかを示しています。
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を入力せずに直接実行する場合は、省略できます。
注:最後の行が空の場合、または折り返された場合は機能しませんが、ほとんどの場合は引き続き役立ちます
簡単な答え:いいえ、おそらくこれを行うための利用可能な方法はありません。
長い答え:
vi
のようなものである場合(出力がニースの行指向のテキストではない場合)、複雑になります。とにかく、bashはそれをしません。実際には、この制限を回避するために人々が行うことは、他のプログラムを使用してコマンド出力をキャプチャし、それを編集することです。しかし、それはあなたの当面の問題を解決しません。
たとえば、私は vi-like-emacs を使用してアドホックシェルコマンドを発行します。それらがそれ以上の入力を必要としない場合は、それらを window で実行し、コマンドの出力をキャプチャし、必要に応じて出力を編集してコマンドを改良するのが適切です。 Emacsでは、vimだけでなく、そのようなこともできます。
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を使用します。それがお役に立てば幸いです。
最新のコマンドからの出力の最後の行を実行するには、そのコマンドを再実行する場合は(診断メッセージを発行する以外は何もしなかったため)、
_$($(fc -ln -1) | tail -n 1)
_
ステップバイステップ(レイヤーバイレイヤー):
fc
(「FixCommand」の略)は、コマンド履歴にアクセスするためのシェル組み込みコマンドです。
-ln
_ l
(小文字のL)— l ist前のコマンドn
—コマンドを含めないn umbers1
_(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
を追加することで処理できますが、これは広く推奨されていません。tail -n 17 | head -n 1
_行を実行できます。fc
に変更できます。 _fc -ln -1
_は_fc -ln -1 -1
_の略であることに注意してください。 3番目に新しいコマンドを取得するには、_fc -ln -3 -3
_を使用します。