web-dev-qa-db-ja.com

端末-マウスを使用せずにCLIからコピー

CLIでコマンドを起動している間、起動したばかりのコマンドをコピーしたいまたはターミナルで書き込んだものとどこかに貼り付けますマウスを使用せずに。

次の図のように、マウスを使用せずに更新コマンドを(完全または部分的に)コピーしてどこかに貼り付けたいと思います。

copy from CLI without using mouse

21
prayagupd

選択したターミナルエミュレータ内で screen(1) を使用できます(xtermgnome-terminal、...)。

必要な機能はscreenに組み込まれています。あなたはそれが機能する方法に慣れる必要があります:

  • デフォルトでは、「コマンド」キーバインドは CtrlA、「コマンド」シーケンスと特定のアクションを発行してコマンドを作成します。
  • 「コピー」コマンドは次のとおりです。 AltGr[
  • 「貼り付け」コマンドは AltGr]

コマンドを「コピー」して、別の端末に「貼り付け」ることができます。

screenは楽しいので、使い始めると、まったく使用していなかった可能性があるのではないかと思うでしょう。

11
dawud

すでに提供されている回答に加えて、より柔軟なターミナルエミュレータへの移行を検討できます。

端末を rxvt-unicode に変更する準備ができている場合は、 rxvt-perls のようなツールを使用できます。その端末エミュレータで次のキーボード機能を提供するスクリプトのコレクション:

  • テキストを選択、コピー、貼り付け
  • 順方向および逆方向検索
  • 好みのブラウザーでURLを強調表示して開く

単にパッケージをインストールしてから、~/.Xresources、それからあなたは永久に齧歯動物のプラグを抜くことができます。

7
jasonwryan

これを行うには、xclipのようなプログラムを使用します。

NAME
   xclip - command line interface to X selections (clip‐
   board)

インストールしたら、Xクリップボードに接続するために使用できます。残念ながら、これはmysql環境では機能しません(コピーされた行用に独自のバッファーがあります)が、「通常の」コマンドを実行する場合は機能します。例えば ​​:

$ This is a long command line

タイプ CtrlA 行の先頭に移動するには、コマンドを引用符で囲み、エコーします。

$ echo -e "This is a long command line" |xclip 

これで、ミドルクリックのクリップボードに「これは長いコマンドラインです」と表示されます。

マウスを使わずに貼り付けたい場合は、貼り付け先によって異なります。次のコマンドを実行して、別のターミナルに貼り付けることができます。

$ xclip -o

コマンドをkill(cut)するだけで、同じターミナルに貼り付けることができます CtrlK 次に貼り付け CtrlY

Bashの履歴を使用して、端末間でコマンドを保存することもできます。この行を~/.bashrcに追加します:

Prompt_COMMAND='history -a; history -r'

Prompt_COMMANDは特別なbash変数です。設定されている場合、値は新しいプロンプトを発行する前にコマンドとして実行されます。 history -aは現在のセッションの履歴を履歴ファイルに書き込み、history -rはそのファイルを再読み込みします。つまり、実行するすべてのコマンドが履歴ファイルにすぐに書き込まれます。

これで、長いコマンドラインを実行するときに、別のターミナルに切り替えてReturnキーを押すことができ($PROMT_COMMANDを実行するか、新しいターミナルウィンドウを開くだけです)、このターミナルの履歴にアクセスできます。あなたが今ヒットした場合 Up 新しいターミナルで実行できます。

5
terdon

@evilsoupは良い解決策を提案していますが、頻繁に失敗します。

簡単な解決策

これが壊れないソリューションです。

history | tail -2 | head -1 | xclip -selection clipboard

このコマンドを実行するだけで、実行したコマンドがクリップボードにコピーされます。

基本的には、コマンド履歴を出力し、最後から2番目のコマンドを取得してクリップボードに送ります(最後のコマンドはこれ自体なので、最後から2番目のコマンドを選択します)。

カスタム関数

迅速な解決策に基づいて開発した、これは私が書いた小さな関数です。これはかなりスマートで、最後に使用したコマンドをコピーします。数値引数を指定して、last-n番目のコマンドをコピーすることもできます。例えば。最後から2番目のコマンドをコピーするには、2を引数として指定します

myclipcopy () {

  if [ -z $1 ]
    then  # if no argument was provided then just copy the last used command
    history | tail -2 | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g' | xclip -selection clipboard
    echo 'Anyways, the following command has been copied:'
    history | tail -2 | head -1| sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g'

  else
    myindex=$(( $1+1 ))
    history | tail -$myindex | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g' | xclip -selection clipboard
    echo "The following command has been copied:"
    history | tail -$myindex | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g'
  fi

  #Delete this command itself from the history
  myhisnum=$(history | tail -1 | grep -oP '\s\d+\s' | grep -oP '\d+'); history -d $myhisnum
}

上記の関数を~/.bashrcファイルにコピーして貼り付けます。これを別のbashスクリプトファイルに入れてスクリプトを実行すると、履歴コマンドがその履歴にアクセスできなくなるため、機能しないことに注意してください。

最後に、次のように実行します。

myclipcopy 3
# This copies the third-last command

さらに、この関数に追加された素晴らしい機能の1つは、実行後に履歴から自分自身を削除することです。コマンドの「後方」インデックスは変更されないため、これは役立ちます。

1
shivams

このコマンドは、bashの履歴拡張(so !!は、端末に入力した最後の行に展開されます)。おそらくxclipまたはxselをインストールする必要があります。

echo "!!" | xclip -selection clipboard

echo "!!" | xsel -i --clipboard

これにより、最後のコマンドが Ctrl+v クリップボード。これにより、任意のGUIプログラムに貼り付けることができます(または Ctrl+Shift+v ほとんどの端末エミュレータ、または"+p in vim)。

これは二重引用符を含むいくつかの行で壊れます、例えば:

$ echo "foo;bar"
foo;bar
$ echo "!!"
echo "echo "foo;bar""
echo foo
The program 'bar' is currently not installed. You can install it by typing:
Sudo apt-get install bar

例として挙げたコマンドでも機能します。二重引用符がエスケープしている場合にのみ問題が発生するはずです;&&&||| 等々。

0
evilsoup

おそらく最も便利な解決策ではないかもしれませんが、私はそれを使用しているので、追加のソフトインストールを必要としない他のユーザーにとっても役立ちます。

  1. 便利なディレクトリに一時ファイルを作成する必要があります

  2. 必要な指示またはテキストをそのファイルに転送します。方向を転送するために使用できます

    echo $(pwd) 1> tempo
    
  3. ファイルから方向を取得するには、コマンドを使用します

    cd $(tail -n 1 tempo)
    

コマンドをコピーして貼り付ける場合、このシステムはもちろんどちらでも機能します。お役に立てば幸いです

0