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


20

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

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

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

回答:


22

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

準備:

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

sudo apt-get install xsel

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

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

xsel -ib <<<!!:q

あなたが2番目に新しいコマンドをコピーしたい場合は、交換する!!!-2第三最新の使用のために、!-3そしてそうで。

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

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

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

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

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

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

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

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

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

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

    • -iパラメータが伝えxsel標準入力から読み取るように(通常は、この手段のキーボード入力が、私たちはここにリダイレクト何かになるだろう)
    • この-bパラメーターは、Xの「プライマリ」または「セカンダリ」選択の代わりにクリップボードを使用することを指定します。

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

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

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

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

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

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

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

  • alias name='command'Bashでエイリアスを設定する構文です。commandあなたが実行するたびに実行されますname今から。

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

  • |パイプです。コマンドの標準出力( "stdout")をその前のコマンドのターミナル標準( "stdin")にリダイレクトします。

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

    • -iパラメータが伝えxsel標準入力から読み取るように(通常は、この手段のキーボード入力が、私たちはここにリダイレクト何かになるだろう)
    • この-bパラメーターは、Xの「プライマリ」または「セカンダリ」選択の代わりにクリップボードを使用することを指定します。

1
いい答えですが、パイプを避けることができますか?きれいにしてください?<<<"!!" xsel -ib
コス

@kosはい、ありがとう。それは少し簡単になります。<<<構造が再び呼び出される方法を思い出すために私の心を助けることができますか?そして、私<<<!!:q xsel -ibは良いと思います(履歴バンコマンドに引用をさせる)、またはあなたは同意しませんか?
バイトコマンダー

ただし!!:q、単一引用符(')を使用します...
バイトコマンダー

そうです、拡張はを使用して実行され<<<"!!" xsel -ibます。はい、<<<!!:q xsel -ibより良いです、それのために行きます。
コス

ニースは、xsel興味深い構文を持っている
Sergiy Kolodyazhnyy

5

以下を使用できます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

1
私はまだコマンド出力を取得しますが、行自体が欲しいだけです。
ヴァルターシルバ

echo "command" | xclip -selection clipboard...または、以下のスクリプトにし~/.binますecho "$@" | xclip -selection clipboard。「cpy」として保存すると、cpy youtube-dl stuff実行されずにクリップボードにコピーされます。
アレックス

そして、あなたがそれを実行したい場合... echo "$@" | xclip -selection c && $@、またはevalでより賢い何か...-
アレックス

@ValterHenrique編集を確認してください。
heemayl

3

これ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行の履歴を取得して最後の行を削除するという事実に対処しています。

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


おそらくtailsedコマンドを1つまたは2つのコマンドに単純化できます。ここ!!で説明さているこれらのコマンドの使用-ZSHで使用可能になっているはずです...-
Wilf

ああ、!!確かにここで役立つようです、ありがとう!
アレック

0

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.