web-dev-qa-db-ja.com

マウスなしでコマンドライン全体をクリップボードにコピーする方法は?

私の端末にこの行があると想像してください:

youtube-dl --get-thumbnail --extract-audio --audio-format mp3 https://www.youtube.com/watch?v=

テストした後、上記の行をクリップボードにコピーして、スクリプトファイルに貼り付けたいと思います。 コマンドの出力ではない。しかし、マウスを使用せずにこれを行う。私は、キーボードだけに手を置くのが好きです。私はそのように速く、いくつかのコーディングを行うと思います:)

20
Valter Silva

私の答えは、3つの異なる構文で簡単なコマンドを提供します。これらはすべて同じように機能しますが、1つは2つ目よりも少し短く、入力しやすいです。 3番目のバリエーションは、いわゆるエイリアスです。つまり、コマンドにカスタム名を割り当て、それを実行することで、複雑なものを覚えることなく呼び出すことができます。

準備:

最初に、ターミナルからXクリップボードにアクセスできるパッケージxselをインストールします。

Sudo apt-get install xsel

コマンドバリエーション1(短い):

その後、次の行を入力して、前のコマンドをクリップボードにコピーできます。

xsel -ib <<<!!:q

2番目に最新のコマンドをコピーする場合は、!!!-2に置き換えます。3番目に最新のコマンドを使用する場合は!-3などになります。

実行しているものを説明するために、ここでコマンドの短い内訳を示します。

  • xselは、Xクリップボードにアクセスするためのコマンドラインツールです。
    詳細については、マンページをご覧ください オンライン Manpage icon またはman xselを実行します。

    • -iパラメーターは、xselにstdinから読み取るように指示します(通常、これはキーボード入力を意味しますが、ここで何かをリダイレクトします)
    • -bパラメーターは、Xの「プライマリ」または「セカンダリ」選択の代わりにクリップボードを使用することを指定します。
  • <<<は、「Here String」と呼ばれる特別なBash構文です。
    基本的には(評価せずに!)引数(1つだけ!)を展開し、文字列としてコマンドの前後のコマンドの標準入力(標準入力)にリダイレクトします。

  • !!:qは、bashで履歴を展開するための「bangコマンド」と呼ばれます。それは、以前に入力されたコマンドラインで自分自身を置き換えます。
    詳細については、man historyを実行してローカルのマンページを読んでください(オンラインのマンページは役に立ちません)。

    • !!は前のコマンドラインを表し、!-1の同義語です。
      明らかに!-2は、最後から2番目のコマンドラインを意味します。マイナス記号-を忘れないでください。そうしないと、入力した2番目(3番目/ ...)のコマンドが返されます。
    • :qはbangコマンドを変更し、bashに置換を単一引用符(')で囲むように指示して、シェルによるそれ以上の展開を防ぎます。

コマンドバリエーション2(少し長い):

echo !!:q | xsel -ib
  • echoには、すべての引数を端末の標準出力に出力するという単純なジョブがあります。

  • !!:qは、bashで履歴を展開するための「bangコマンド」と呼ばれます。それは、以前に入力されたコマンドラインで自分自身を置き換えます。

    • !!は前のコマンドラインを表し、!-1の同義語です。明らかに!-2は、最後から2番目のコマンドラインを意味します。マイナス記号-を忘れないでください。そうしないと、入力した2番目(3番目/ ...)のコマンドが返されます。
    • :qはbangコマンドを変更し、bashに置換を単一引用符(')で囲むように指示して、シェルによるそれ以上の展開を防ぎます。
  • |はパイプです。コマンドの前のコマンドの端末出力( "stdout")を、その後のコマンドの端末入力( "stdin")にリダイレクトします。

  • xselは、Xクリップボードにアクセスするためのコマンドラインツールです。
    詳細については、マンページをご覧ください オンライン Manpage icon またはman xselを実行します。

    • -iパラメーターは、xselにstdinから読み取るように指示します(通常、これはキーボード入力を意味しますが、ここで何かをリダイレクトします)
    • -bパラメーターは、Xの「プライマリ」または「セカンダリ」選択の代わりにクリップボードを使用することを指定します。

コマンドバリエーション3(エイリアス):

頻繁に使用する長いコマンドや複雑なコマンドを覚えたくない場合、bashエイリアスは便利です。このコマンドを単純なエイリアス名に割り当てることができ、長いコマンドの代わりに実行して同じ名前を実現できます。

残念ながら、bangコマンドは特別なBash機能であり、エイリアスが解決される前に展開されるため、!!部分が機能しないため、上記のバリエーションの1つを単にエイリアス化することはできません。ただし、回避策があります。

エイリアスを設定するには、ターミナルで次の行を実行します。 copylastcommandの代わりに任意の有効なBash変数名を選択できることに注意してください。

alias copylastcommand='history -p \!\! | xsel -ib'

ただし、これは現在のBashセッションでのみ持続します。つまり、ターミナルウィンドウを閉じた後、エイリアスは消えます。上記の行を~/.bashrcファイルの末尾、または~/.bash_aliasesファイルがある場合はその末尾に追加することで、すべてのBashセッションで永続化できます。

繰り返しますが、行の短い内訳:

  • alias name='command'は、Bashでエイリアスを設定する構文です。 commandは、今後nameを実行するたびに実行されます。

  • history -p \!\!は、以前に実行したコマンドラインを標準出力(標準出力)に出力します。 -pスイッチがないと、印刷するだけでなく、コマンドを再度実行します。
    バックスラッシュ(!)で前髪(\)をエスケープする必要があることに注意してください。そのままエイリアスにする必要があります。
    また、2番目のbangを-nに置き換えることにより、[n]番目の最近のコマンドを指定することもできます。 \!-2

  • |はパイプです。コマンドの前のコマンドの標準出力( "stdout")を、その後のコマンドの端末標準( "stdin")にリダイレクトします。

  • xselは、Xクリップボードにアクセスするためのコマンドラインツールです。
    詳細については、マンページをご覧ください オンライン Manpage icon またはman xselを実行します。

    • -iパラメーターは、xselにstdinから読み取るよう指示します(通常、これはキーボード入力を意味しますが、ここで何かをリダイレクトします)
    • -bパラメーターは、Xの「プライマリ」または「セカンダリ」選択の代わりにクリップボードを使用することを指定します。
22
Byte Commander

xclipを使用できます:

some_command | xclip -selection c

だからあなたの場合:

youtube-dl .... | xclip -selection c

cはクリップボードを表します。

最初にxclipをインストールする必要がある場合があります。

Sudo apt-get install xclip

編集:

入力したコマンド(出力ではなく)をクリップボードにコピーする場合は、Here文字列を使用できます。

 xclip -selection c <<<"$(echo foobar)"

またはパイプ:

echo foobar | xclip -selection c
5
heemayl

これを行うためにzshを使用するxclipの小さなスクリプトを作成しました。

#!/bin/zsh
export HISTFILE=~/.zsh_history
fc -R
fc -l | tail -n 2 | sed -n '1p' | sed 's/[0-9]*  //' | xclip -selection c

このスクリプトは、シェル/ターミナルに入力された最後のコマンドをシステムのクリップボードにコピーします。通常のリモートサーバーでは機能しません。

このスクリプトを書くのに数分しかかからないと思っていましたが、zshが履歴を処理する方法につまずいたため、動作させるのに驚くほど時間がかかりました。

このtail -n 2と最初のsedは、このスクリプト自体のコマンドが履歴に記録されているという事実を処理しているため、2行の履歴を取得して最後の1行を削除します。 。

このスクリプトは機能し、一種の楽しいパズルでしたが、zshを使用してこれを行うためのより簡単な方法またはよりエレガントな方法があるかどうか、本当に興味があります。

3
alec

クリップボードマネージャーとして使用しています。

alias pbpaste='xclip -i -selection clipboard -o'
alias pbcopy='xclip -selection clipboard'
vimscratch='vim -c 'setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile' 

クリップボードへの最後のコマンド

alias last2cb='fc -ln -1 | pbcopy'

クリップボードをvimスクラッチに

alias vcb='pbpaste | vimscratch -'

ZSH固有

# Copy the most recent command to the clipboard
function _pbcopy_last_command(){
    fc -ln -1 | pbcopy
}
zle -N pbcopy-last-command _pbcopy_last_command
bindkey '^x^y' pbcopy-last-command
# Ctrl-x Ctrl-y  to copy last command to the clipboard


# Edit content of clipboard on vim (scratch buffer)
function _edit_clipboard(){
    pbpaste | vim -c 'setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile' -
}
zle -N edit-clipboard _edit_clipboard
bindkey '^x^v' edit-clipboard
# Ctrl-x Ctrl-v to edit clipboard on vim


# define function that retrieves and runs last command
function run-again {
    # get previous history item
    zle up-history
    # confirm command
    zle accept-line
}
# define run-again widget from function of the same name
zle -N run-again
bindkey '\er' run-again
# alt-r to run last command again

これらのアイデアは、独自のソリューションを作成するのに役立つと思います

0
SergioAraujo