コマンドとその出力を貼り付けるためのコマンド


9

しばしば私はgithubバグに何かを投稿したいです

$ ping google.com
PING google.com (216.58.195.238): 56 data bytes
Request timeout for icmp_seq 0
64 bytes from 216.58.195.238: icmp_seq=0 ttl=53 time=1064.747 ms

今、私は、コマンドを実行し、使用はscreen「S C-a C-[、面積を強調するためenterに貼り付け、そのバッファにコピーしvim、その後、ファイルに書き込むと、catそれにpbcopy。もっと良い方法があるはずです。

teeプレフィックスにa $を付けて入力するコマンドとすべての出力を実行できるコマンドはありpbcopyますか?または何か近い?私は想像します

$ demo ping google.com
PING google.com (216.58.195.238): 56 data bytes
Request timeout for icmp_seq 0
64 bytes from 216.58.195.238: icmp_seq=0 ttl=53 time=1064.747 ms
^C
$

そして私が貼り付けた元のものがMacのクリップボードにあります。


これは本当にOS Xに固有のものですか?
16年

いいえ。他のプラットフォームでファイルからクリップボードに移動するために使用するユーティリティはどれでも代用できpbcopy、同じ質問になります。
Paul Tarjan

2
好奇心が強い:なぜマウスを使わないのですか?

2
vim部分はすべて省略できます。単に実行pbcopyC-a C-]て、その標準入力に。

マウスを使用した@hopは遅く、テキストに相当する画面が複数ある場合はうまく機能しません
Paul Tarjan

回答:


10

1つのオプションは-x、コマンドを実行するサブシェルで(を使用して)トレースを有効にすることです。これにより、コマンドがSTDERRに書き込まれ、標準出力がSTDOUTに書き込まれます。両方を収集し、パイプしてpbcopy

$ ( set -x; ping -c 3 google.com ) 2>&1 | pbcopy

$ pbpaste
+ ping -c 3 google.com
PING google.com (173.194.217.138): 56 data bytes
64 bytes from 173.194.217.138: icmp_seq=0 ttl=44 time=37.436 ms
64 bytes from 173.194.217.138: icmp_seq=1 ttl=44 time=38.891 ms
64 bytes from 173.194.217.138: icmp_seq=2 ttl=44 time=39.329 ms
--- google.com ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 37.436/38.552/39.329/0.809 ms

set -x興味深いアプローチです。よくわかりました!
DopeGhoti

私は(さらに好ましくは2つの異なるストリーム上)も、私のコマンドがあまりにもプリントアウト見てみたい、と希望+する$
ポールTarjan

1
@PaulTarjan:PS4を適宜変更します。exemple(ないあなたが必要なものが、いくつかの可能なオプションを示し): PS4='\\$ ${BASH_SOURCE[0]:-inherited}:line ${LINENO}:${FUNCNAME[0]:+${FUNCNAME[0]}(): } '。「\\ $」は「$」を最初の文字にし、その文字を繰り返して呼び出しのレベルを示します。(第1レベルの$、第2レベルの$など)
Olivier Dulac 2016年

7

scriptユーティリティを使用して、プロンプト、コマンド、およびその出力を含むインタラクション全体をキャプチャできます。

script temp.log; cat temp.log | pbcopy
[ do stuff ]
[ end the interaction with ^D or logging out of the shell ]

その後、ファイルを確認すると、その内容は既にクリップボードにあります。

あなたもすることができます:

script temp.log 'somecommand'; cat temp.log | pbcopy

これは近いです。これには、必要なだけのプロンプト全体が含まれていて、$ 1つだけ必要な場所で多くのコマンドを実行でき、不要なヘッダーとフッターが追加されます。
Paul Tarjan、2016年

1
ANSIシーケンスを抑制できるとは思いませんが(設計上、セッション全体をキャプチャするためにそこにあります)、ヘッダーを抑制できます。のマニュアルページを確認してください-q。あなたは使用することができますsedANSIコードを取り除くために: sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
DopeGhoti

2
を使用script temp.log env PS1='$ ' bash --norcして、必要なプロンプトでbashを取得できます。また、あなたのを編集することができます~/.bashrcの使用をチェックするscriptと、プロンプトを変更:[ $(ps -o command= -p $PPID) = 'script' ] && PS1='$ '
エリック・


1

あなたから別の答えにコメント、あなたはしたくない全体プロンプトをコピーする、だけ$

これを解決する方法は簡単です:

16:54:53 [myname mydirectory] 535 $ bash
bash-3.2$ PS1='\$ '
$ echo some command
some command
$ exit
exit
16:57:17 [myname mydirectory] 536 $

簡単です。次に、マウスを使用して、必要なプロンプト、コマンド、および出力をコピーして貼り付けます。


私は別のユースケースでは、単にコマンドを望んではなく、その出力ではなくプロンプトが、誰かの指示を与えることができるように、私は別名、設定したzvために(キーボードの「コマンドV」に近い)をコピーします私のクリップボードへの最後のコマンド

alias zv='printf %s "$(history -p \!\!)" | pbcopy'

printfとコマンド置換の使用に注意しhistoryて、クリップボードに末尾の改行が含まれないようにしてください。


0

現在、コマンドを実行し、画面のCa C- [を使用して領域を強調表示し、Enterキーを押してそのバッファーにコピーします。

すでに使用しているGNU screen場合は、外部ツールを使用して選択範囲を直接コピーできます。たとえば、これを~/.screenrcLinux に追加しました。

bind b eval writebuf 'exec /bin/sh -c " xsel -i </tmp/screen-exchange"' 'exec /bin/sh -c "killall xsel"'

これで、選択をマークし、Control- a [を押してSpaceControl- a bを押し て実行できxselます。それは私の考えではありません、それは実際にはかなり一般的です。ことに注意してください一部の人々はとそれを使うpbcopy代わりにxsel、それはあなたのために働くかもしれので、何の問題もなく。

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