ターミナル-マウスを使用せずにCLIからコピー


20

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

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

マウスを使用せずにCLIからコピーする


1
マウスなしでgnomeを使用していますか?
ott--

回答:


11

あなたは使用することができますscreen(1) (お好みの端末エミュレータ内xtermgnome-terminal、...)。

必要な機能はに組み込まれていscreenます。あなたはそれがどのように機能するかを理解する必要があります:

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

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

screen 楽しいし、一度使い始めたら、どうしてそれをまったく使っていないのか不思議に思うでしょう。


screenコマンドがなかったので、私はgnome-terminalにインストールし、ターミナルで起動しscreenました。しかし、その後始められませんでした。また、組み込みの画面が何を意味するのか理解できませんでした。
prayagupd

1
読んでくださいman screen。また、私は「内蔵の書いた中でのコピーを意味し、画面」/機能が中に存在して貼り付けるscreen デザインによって
ダウド

spaceキーを使用して必要な領域を選択する必要があります。Y行全体または望ましい領域をコピーするために使用する必要があります。画面はvi動きやすいです。
FelikZ

AltGrキーは何ですか?私が持っているAlt
alhelal

1
screenこのツールは、この関数は、ここで説明していません。そして、それは質問への答えを提供していないようです。
ルイスデスーサ

7

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

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

  • テキストの選択、コピー、貼り付け
  • 前方および後方検索
  • 好みのブラウザでURLをハイライトして開きます

パッケージをインストールし、に数行追加するだけで~/.Xresources、げっ歯類を抜くことができます。


4

次のようなプログラムを使用してこれを行うことができます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

でコマンドを強制終了(カット)しCtrlKてからで貼り付けるだけで、同じ端末に貼り付けることができCtrlYます。

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

PROMPT_COMMAND='history -a; history -r'

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

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


大丈夫ですが、私はまだマウスを使用する必要がありますか?
prayagupd

@PrayagUpdああ、はい、それはミドルクリックバッファーにコピーされます。別の方法については、更新された回答を参照してください。
テルドン

それ$ xclip -oは私がxclipedを印刷するだけなので、私は欲しいものではないと思います。ただし、少なくとも同じ端末でのカットアンドペーストの場合とCtrl+Aその後の場合は+1 。Ctrl+KCtrl+Y
prayagupd

@PrayagUpd問題は、さまざまなクリップボードバッファーが動作していることであり、解決策は、何をしたいのかによって異なります。必要なものの具体的な例で質問を更新してください。私はどこから(mysqlはトリッキーになるでしょう)そしてどこへコピーすることを意味します。
テルドン

1
@PrayagUpdは、別のトリックの更新された回答を参照します。
テルドン

1

@evilsoupは良い解決策を提案しましたが、しばしば壊れます。

クイックソリューション

ここで壊れることはありませんソリューション

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

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

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

カスタム関数

迅速なソリューションで開発しているのは、私が書いた小さな関数です。これは非常に賢く、最後に使用したコマンドをコピーします。最後の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スクリプトファイルに入れてスクリプトを実行すると、historyコマンドは履歴にアクセスできなくなるため、スクリプトは機能しません。

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

myclipcopy 3
# This copies the third-last command

さらに、この関数に追加されたすばらしい機能の1つは、実行後に履歴から自身を削除することです。これは、コマンドの「後方」インデックスが変わらないため便利です。


これは堅牢ではありません。
mikeserv

@mikeserv:名前を「カスタム関数」に変更しました。しかし、なぜそれをダウン票したのですか?これが質問に適切に答えていることに気づきませんか?さらに、「堅牢」と言った理由は、実際に壊れてはならないからです。ダウン投票することで、投稿から適切な回答を非表示にするだけです。
シヴァム

特にbashとlinux、どちらも質問で指定されていないので、多くのことを想定しているので、私は投票しました。また、あなたのパイプラインは
途方もなく

@mikeserv:コメントをありがとう。うまくいけば、これが私がより良い答えを生み出すのに役立つでしょう。私は正規表現とパイプラインがいことを受け入れます。しかし、彼らは十分にテストされており、私はそれを使用しています。仮定については、最高評価の回答がユーザーが使用しているという仮定を採用していることに気づきましたかscreen。2番目に高い評価の回答も想定されbashていましたlinux。さらに、bashスクリプトはzshまたは他のほとんどのシェルで機能するため、仮定は大した問題ではありません。
シヴァム

私はそれがsayいとは言わなかった-私はそれが複雑すぎると言った。いいえ、他のほとんどのシェルではうまく動作しません。さらに、質問で実際に描かれているCLIはMySQLです。ただし、他の回答については良い点です。
mikeserv

0

このコマンドは、bashの履歴展開を使用します(したがって!!、端末に入力した最後の行に展開します)。xclipまたはをインストールする必要がありxselます。

echo "!!" | xclip -selection clipboard

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

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

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

$ 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

ただし、例として指定したコマンドに対しては機能します。二重引用符がエスケープされている場合などにのみ問題が発生するはずです; & && | ||


この答えをありがとう、これは私がすぐに実装できる最も実用的なソリューションでした。そして、「!」をまったく引用しないことで、「」の問題を回避できると思います。そうすれば、問題なく動作しecho !!ます(以前のコマンドが開始された-n-eまたはechoそれ自体が取る他のいくつかのオプションを除く)。
スンダ

0

たぶん最も便利な解決策ではないかもしれませんが、私はそれを使用しているので、追加のソフトインストールを必要とせず、他の人にとってより役立つ場合があります。

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

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

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

    cd $(tail -n 1 tempo)
    

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


Kusalanandaの編集に感謝します。今、答えははるかに良く見える
ドミトリーコルムレフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.