web-dev-qa-db-ja.com

Bashスクリプトでクリップボードとの間でパイプする

Bashでクリップボードとの間でパイプをやり取りできますか?

それがデバイスハンドルに/からハンドルしているか、補助アプリケーションを使用しているかどうか、私は何も見つけることができません。

たとえば、/dev/clipがクリップボードにリンクしているデバイスであれば、次のようにします。

cat /dev/clip        # Dump the contents of the clipboard
cat foo > /dev/clip  # Dump the contents of "foo" into the clipboard
801
marcog

あなたが扱うことができるかもしれないたくさんのクリップボードがあります。私はあなたがおそらくX Windowsのプライマリクリップボードにものを入れたいと思うLinuxユーザーであると思います。通常、会話したいクリップボードには、会話できるユーティリティがあります。

Xの場合、xclip(など)があります。 xclip -selection cは、ほとんどのアプリケーションでCtrl-C、Ctrl-Vで動作するデータをクリップボードに送ります。

Mac OS Xを使っているなら、pbcopyがあります。

Linux端末モード(Xなし)の場合は、クリップボードのあるgpmまたは screen を調べます。 screenコマンドreadregを試してください。

Windows 10以降またはcygwinでは、/dev/clipboardまたはclipを使用してください。

736
lhunath

別名xclip="xclip -selection c"を使用していることを確認してください。 Ctrl+v 別の場所に貼り付けます。

echo test | xclip    

Ctrl+v === test

240
doug

インストール

# You can install xclip using `apt-get`
apt-get install xclip

# or `pacman`
pacman -S xclip

# or `dnf`
dnf install xclip

apt-getpacmandnfのいずれにもアクセスできない場合は、 sourceforge にソースがあります。

セットアップ

Bash

~/.bash_aliasesに以下を追加します。

alias setclip="xclip -selection c"
alias getclip="xclip -selection c -o"

. ~/.bash_aliasesを使用するか、プロファイルを再起動して新しい設定を読み込むことを忘れないでください。

~/.config/fish/config.fishに以下を追加します。

abbr setclip "xclip -selection c"
abbr getclip "xclip -selection c -o"

変更を適用するために端末を再起動して、魚のインスタンスを再起動することを忘れないでください。

使用法

setclipgetclipを使うことができます。例えば:

$ echo foo | setclip
$ getclip
foo
154
tleb

MacOSでは組み込みの pbcopypbpaste コマンドを使います。

たとえば、あなたが実行した場合

cat ~/.bashrc | pbcopy

~/.bashrcファイルの内容は、Cmd + vショートカットで貼り付けることができます。

121
jtruelove

試します

xclip

xclip - command line interface to X selections (clipboard) 

おとこ

35
Zoredache

xsel Debian/Ubuntu/Mintについて

# append to clipboard:
cat 'the file with content' | xsel -ib

# or type in the happy face :) and ...
echo 'the happy face :) and content' | xsel -ib

# show clipboard
xsel -b

# Get more info:
man xsel

インストール

Sudo apt-get install xsel
21
Andrew_1510

うわー、私はこの質問に対していくつの答えがあるのか​​信じられません。全部試したわけではありませんが、トップ3または4を試したところ、どれもうまくいきません。私にとってうまくいったのは、dougというユーザーによって書かれたコメントの1つにある答えでした。私はそれがとても有用であると思ったので、私は答えで言い直すことにしました。

Xcopyユーティリティをインストールし、ターミナルに入ったら、次のように入力します。

コピー

Thing_you_want_to_copy|xclip -selection c

貼り付け

myvariable=$(xclip -selection clipboard -o)

私はたくさんの答えがpbpasteとpbcopyを推薦しているのに気づきました。これらのユーティリティを使用していても、何らかの理由でレポジトリで使用できない場合は、xcopyコマンドのエイリアスを作成してpbpasteおよびpbcopyと呼びます。

alias pbcopy="xclip -selection c" 
alias pbpaste="xclip -selection clipboard -o" 

それで、それはこのようになります:

Thing_you_want_to_copy|pbcopy
myvariable=$(pbpaste)
13
thebunnyrules

これは、複数のプラットフォームで動作するクリップボードを読むためのbashスクリプトを使用する準備ができていることです。機能を追加する場合は、ここでスクリプトを編集してください(例:より多くのプラットフォーム)。

#!/bin/bash
# WF 2013-10-04
# multi platform clipboard read access
# supports
#   Mac OS X
#   git Shell / Cygwin (Windows)
#   Linux (e.g. Ubuntu)

#
# display an error
#
error() {
  echo "error: $1" 1>&2
  exit 1
}

#
# getClipboard
#
function getClipboard() {
 os=`uname`
      case $os in 
        # git bash  (Windows)
        MINGW32_NT-6.1)
          cat /dev/clipboard;;
        # Mac OS X
        Darwin*)
          pbpaste;;  
        # Linux 
        Linux*)
          # works only for X clipboard - a check that X is running might be due
          xclip -o;;
        *)
          error "unsupported os $os";;
      esac
}

tmp=/tmp/clipboard$$
getClipboard >$tmp
cat $tmp
# comment out for debugging
rm $tmp
10
Wolfgang Fahl

Linux用のWindowsサブシステムでは、clip.exeを使用してクリップボードにコピーできます。

cat file | clip.exe

|パイプコマンドを使用することを忘れないでください。 >コマンドではありません、それはうまくいきませんので。

10

Windows(Cygwin搭載)では、 this の記事に記載されているcat /dev/clipboardまたはecho "foo" > /dev/clipboardを試してください。

9
Norman H

Linuxにはさまざまなクリップボードがあります。 Xサーバには1つ、ウィンドウマネージャにはもう1つなどがあります。標準的なデバイスはありません。

そうです、CLIでは、 Emacsvi などの他のアプリケーションと同様に、screenプログラムにも独自のクリップボードがあります。

Xでは、 xclip を使用できます。

あなたは他の可能な答えのためにこのスレッドをチェックすることができます: http://unix.derkeiler.com/Newsgroups/comp.unix.Shell/2004-07/0919.html

9
Sunny Milenov

Macのみ

echo "Hello World" | pbcopy
pbpaste

これらは/usr/bin/pbcopy/usr/bin/pbpasteにあります。

8
nyitguy

2018回答

clipboard-cli を使用してください。 macOS、Windows、Linux、OpenBSD、FreeBSD、Androidで問題なく動作します。

以下でインストールしてください。

npm install -g clipboard-cli

それからあなたはできる

echo foo | clipboard

必要に応じて、次のコードを.bashrc.bash_profile、または.zshrcに入れることで、cbにエイリアスできます。

alias cb=clipboard

8
Evan Conrad

Windows(Cygwin)でクリップボードにコピーして貼り付けます。

見る:

$ clip.exe - ?

CLIP説明:コマンドラインツールの出力をWindowsのクリップボードにリダイレクトします。このテキスト出力は他のプログラムに貼り付けることができます。パラメータリスト:/?このヘルプメッセージを表示します。例:DIR | CLIP現在のディレクトリリストのコピーをWindowsのクリップボードに置きます。 CLIP <README.TXT readme.txtのテキストのコピーをWindowsのクリップボードに置きます。

Getclip(shift + insの代わりに使うことができます!)、putclip(echo oaeuoa | putclip.exeをクリップに入れる)もあります。

5
Stenemo
  xsel -b

X11の仕事をします、それはほとんどすでにインストールされています。 xselのmanページを見れば、努力する価値があります。

4
Martin Fischer

これは単純なPythonスクリプトで、必要なものだけを実行します。

#!/usr/bin/python

import sys

# Clipboard storage
clipboard_file = '/tmp/clipboard.tmp'

if(sys.stdin.isatty()): # Should write clipboard contents out to stdout
    with open(clipboard_file, 'r') as c:
        sys.stdout.write(c.read())
Elif(sys.stdout.isatty()): # Should save stdin to clipboard
    with open(clipboard_file, 'w') as c:
        c.write(sys.stdin.read())

これを実行ファイルとしてあなたのパスのどこかに保存してください(私はそれを/usr/local/bin/clipに保存しました。あなたのクリップボードに保存されるものをパイプで送ることができます...

echo "Hello World" | clip

そして、クリップボードの内容を他のプログラムに渡すことができます。

clip | cowsay
 _____________
< Hello World >
 -------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

単独で実行すると、クリップボードの内容が出力されるだけです。

3
tysweat

このスレッドから、gclip/xclip/xselというサードパーティソフトウェアをインストールする必要がないオプションがあります。

Perlスクリプト(Perlは通常いつもインストールされているので)

use Win32::Clipboard;
print Win32::Clipboard::GetText();
2
VonC

私が何年も前に書いたいくつかのWindowsプログラム。クリップボードのダンプ、プッシュ、追加、印刷ができます。それはこのように動作します:

dumpclip | Perl -pe "s/monkey/chimp/g;" | pushclip

それはソースコードを含みます: cmd_clip.Zip

2
jeng

いくつかの方法があります。言及されている方法のいくつかは(私が思う)tmux、screen、vim、emacs、そしてShellを含みます。私はemacsもスクリーンも知らないので、他の3つを見ていきます。

Tmux

Xの選択ではありませんが、tmuxにはprefix-[からアクセスできるコピーモードがあります(prefixは Ctrl+B デフォルトで)。このモードに使用されるバッファはtmux専用のもので、tmux専用です。これはかなりの可能性を広げ、正しい状況でのXの選択よりも用途が広くなります。

このモードを終了するには、 q;移動するには、vimまたはemacsバインディング(default = vim)を使用します。移動にはhjkl、文字/行/ブロック選択にはv/V/C-vなどを選択します。 Enter コピーしてモードを終了します。

このバッファから貼り付けるには、prefix-]を使用します。

シェル

X11のインストールには、デフォルトでxclipxselの2つのプログラムが付属しているようです(startxxinitの両方に付属しているのと同じようなものです)。他の答えのほとんどはxclipに言及しています、そして私はその簡潔さのためにxselがとても好きです、それで私はxselをカバーするつもりです。

xsel(1x) から

入力オプション

-a、 - append

選択に標準入力を追加します。含意 - i

-f、 - follow

標準入力が増えるにつれて選択に追加します。含意 - i

-i、 - input

標準入力を選択範囲に読み込みます。

出力オプション

-o、 - output

選択範囲を標準出力に書き出します。

アクションオプション

-c、 - clear

選択を解除します。すべての入力オプションをオーバーライドします。

-d、 - delete

現在の選択を削除するように要求します。これは選択をクリアするだけでなく、選択が存在するプログラムに選択されたコンテンツを削除するように要求します。すべての入力オプションをオーバーライドします。

選択オプション

-p、 - primary

pRIMARY選択を操作します(デフォルト)。

-s、 - 2次

2番目の選択を操作します。

-b、 - クリップボード

cLIPBOARD選択で動作します。

そしてそれはあなたが知る必要があるすべてについてです。 pの場合はPRIMARY(またはなし)、sの場合はSECONDARYbの場合はCLIPBOARD、出力の場合はo

例:TTYからfooの出力をコピーし、それをバグレポート用のWebページに貼り付けたいとします。これを行うには、TTY/Xセッションへ/からコピーすることが理想的です。それでは、質問はTTYからクリップボードにアクセスするにはどうすればよいですか?

この例では、Xセッションがディスプレイ:1にあるとします。

$ foo -v
Error: not a real TTY
details:
blah blah @ 0x0000000040abeaf4
blah blah @ 0x0000000040abeaf8
blah blah @ 0x0000000040abeafc
blah blah @ 0x0000000040abeb00
...
$ foo -v | DISPLAY=:1 xsel -b # copies it into clipboard of display :1

それから私はいつものようにそれをフォームにCtrl-Vできます。

今サポートサイトの誰かが私に問題を解決するために実行するように命じるコマンドを与えると言う。それは複雑で長いです。

$ DISPLAY=:1 xsel -bo
Sudo foo --update --clear-cache --source-list="http://foo-software.com/repository/foo/debian/ubuntu/xenial/164914519191464/sources.txt"
$ $(DISPLAY=:1 xsel -bo)
Password for braden:
UPDATING %%%%%%%%%%%%%%%%%%%%%%% 100.00%
Clearing cache...
Fetching sources...
Reticulating splines...
Watering trees...
Climbing mountains...
Looking advanced...
Done.
$ foo
Thank you for your order. A pizza should arrive at your house in the next 20 minutes. Your total is $6.99

ピザの並び順は、コマンドラインの生産的な使い方のようです。

...移動します。

Vim

+clipboardでコンパイルされているなら(これは重要です!あなたのvim --versionをチェックしてください)、VimはXのPRIMARYCLIPBOARDの選択にアクセスできるはずです。 2つの選択はそれぞれ*+レジスタからアクセス可能で、他のレジスタと同じようにあなたの都合で読み書きすることができます。例えば:

:%y+    ; copy/yank (y) everything (%) into the CLIPBOARD selection (+)
"+p     ; select (") the CLIPBOARD selection (+) and paste/put it
ggVG"+y ; Alternative version of the first example

あなたのvimのコピーがXの選択へのアクセスを直接サポートしていないのであれば、それは世界の終わりではありません。最後のセクションで説明したように、xselの手法を使用することができます。

:r ! xsel -bo ; read  (r) from the stdout of (!) `xsel -bo`
:w ! xsel -b  ; write (w) to the stdin of    (!) `xsel -b`

いくつかのキーコンボをバインドするとあなたは良いはずです。

2
Braden Best

macOSではpbpasteを使います

例えば:

クリップボードを更新する

pbpaste | Ruby -ne ' puts "\|" + $_.split( )[1..4].join("\|") ' | pbcopy

楽しい。

1
jiahut

あなたが私のようで、root権限なしでLinuxサーバを走らせていて、xclipやgpmがないなら、一時ファイルを使うことでこの問題を回避することができます。例えば:

$ echo "hello world" > ~/clip
$ echo `cat ~/clip`
hello world
1
horta

良いリファレンスが見つかりました: https://unix.stackexchange.com/questions/69111/

私の場合、クリップボードにコンテンツを貼り付け、そこに貼り付けられているものを確認したいので、ファイル記述子とともにteeコマンドも使用しました。

echo "just a test" | tee >(xclip -i -selection clipboard)

>()はプロセス置換の形式です。 bashはそれぞれを、括弧内のプログラムの標準入力に接続されているファイル記述子へのパスに置き換えます。

teecommandは、コマンドをフォークして「コンテンツをパイプ」し、標準出力「stdout」で結果を確認できるようにします

また、エイリアスを作成してクリップボードに書き込み、クリップボードに書き込み、MACのどこにいるかのように「pbcopy」と「pbpaste」を使用できます。私の場合、zshを使用するときに、エイリアスファイルに次のように記述します。

(( $+commands[xclip] )) && {
    alias pbpaste='xclip -i -selection clipboard -o'
    alias pbcopy='xclip -selection clipboard'
}

zshの(( $+command[name] ))は、コマンド "name"がシステムにインストールされているかどうかをテストし、両方のエイリアスが{}でグループ化されます。 &&はバイナリANDで、aがbの場合、したがってxclipがある場合はエイリアスが設定されます。

echo "another test" | tee >(pbcopy)

クリップボードのコンテンツを取得するには、次のように入力します。

pbpaste | "any-command-you-need-here"
1
SergioAraujo

1年以上経っても、私は少し異なる解決法を共有しています。これが誰かに役立つことを願っています。

昨日私は質問に気づいた:「異なるユーザーセッション間でクリップボードを共有する方法は?」でセッションを切り替えるとき ctrlaltF7 - ctrlaltF8実際、コピーしたものを貼り付けることはできません。

名前付きパイプを基にして、次のようなquick&dirty解決策を思いつきました。それは確かにかなり裸で生です、しかし私はそれが機能的であるとわかりました:

user1@Host:~$ mkfifo /tmp/sharedClip

その後、送信端末で

user1@Host:~$ cat > /tmp/sharedClip

最後に、受信端末で:

user2@Host:~$ cat /tmp/sharedClip

さて、あなたは最初の端末に何かをタイプするかペーストして、 return)、受信端末にすぐに表示されます。そこから、好きな場所にコピー/貼り付けできます。

もちろん、これはユーザー2のクリップボードでコンテンツを利用できるようにするためにユーザー1のクリップボードからコンテンツを厳密に取得するだけではなく、追加の[貼り付けとコピー]をクリックする必要があります。

0
lurix66

xclip-copyfile もあります。

0