用于粘贴我的命令及其输出的命令


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

现在我运行命令,使用screenC-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特有的吗?
phk

不。无论您使用哪种实用程序将文件从其他平台上的文件移动到剪贴板,都可以替代pbcopy,这将是同样的问题。
Paul Tarjan

2
好奇:为什么不使用鼠标?

2
您可以省略整个vim部分。只需运行pbcopyC-a C-]转到其标准输入。

@hop使用鼠标的速度很慢,并且在有多个屏幕的文本值得时效果不佳
Paul Tarjan

Answers:


10

一种选择是-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 '16

我也希望看到我的命令也打印出来(最好还是在2个不同的流上打印),并且希望+成为$
Paul Tarjan

1
@PaulTarjan:然后相应地更改PS4。个例(不是你所需要的,但显示了一些可能的选项): PS4='\\$ ${BASH_SOURCE[0]:-inherited}:line ${LINENO}:${FUNCNAME[0]:+${FUNCNAME[0]}(): } '。“ \\ $”使“ $”成为第一个字符,然后重复该字符以显示调用级别。(第一级为$,第二级为$$,等等)
Olivier Dulac

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

这很近。它包括整个提示,我只想要一个$ ,它让我在只想要一个的地方执行许多命令,并且添加了我不想要的页眉和页脚。
Paul Tarjan

1
我认为它不能抑制ANSI序列(因为通过设计它可以捕获整个会话),但是您可以抑制标头。检查手册页-q。您可以sed用来剥离ANSI代码: sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
DopeGhoti

2
您可以使用script temp.log env PS1='$ ' bash --norc所需的提示来获得重击。或者,您可以编辑~/.bashrc以检查的使用script并更改提示:[ $(ps -o command= -p $PPID) = 'script' ] && PS1='$ '
Eric


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(接近键盘上的“ Command V”)来复制最后一个命令到我的剪贴板

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

请注意使用printf和命令替换,以避免将尾随换行符包含history到剪贴板中。


0

现在,我运行命令,使用屏幕的Ca C- [突出显示该区域,输入将其复制到该缓冲区,

如果您已经使用过GNU screen,则可以使用外部工具直接复制选择。例如,我将其添加到~/.screenrcLinux上:

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

现在,我可以标记选择王氏Control- a [Space现在按 Control- a b运行xsel。这不是我的主意,实际上很普遍。请注意,有些人将其与一起使用pbcopyxsel因此它可能对您有用没有任何问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.