我想从Ruby运行以下shell命令,它将一个字符串复制到剪贴板(在OS X上),'n'在echo
引起的字符串后抑制换行符:
echo -n foobar | pbcopy
- > 工作正常,现在剪贴板包含“foobar”
我尝试过以下操作,但所有这些都会将选项'-n'复制到剪贴板中:
%x[echo -n 'foobar' | pbcopy]
%x[echo -n foobar | pbcopy]
system "echo -n 'foobar' | pbcopy"
system "echo -n foobar | pbcopy"
exec 'echo -n "foobar" | pbcopy'
`echo -n "foobar" | pbcopy`
IO.popen "echo -n 'foobar' | pbcopy"
实现这一目标的正确方法是什么?
答案 0 :(得分:7)
您的问题是-n
只能通过bash内置echo
命令来理解;当您说%x[...]
(或其中任何其他变体)时,该命令将被输入/bin/sh
,即使它确实是/bin/bash
,它也会像POSIX shell一样。解决方案是将shell命令显式地提供给bash:
%x[/bin/bash -c 'echo -n foobar' | pbcopy]
当然,你需要小心引用任何foobar
的真实情况。 -c
开关基本上告诉/bin/bash
您正在为其提供内联脚本:
-c 字符串
如果存在 -c 选项,则从 string 中读取命令。 如果字符串后面有参数,则将它们分配给位置 参数,以 $ 0 开头。
答案 1 :(得分:6)
由于echo
在不同的shell和/bin/echo
中表现不同,因此建议您改为使用printf
。
没有新行:
%x[printf '%s' 'foobar' | pbcopy]
换行:
%x[printf '%s\n' 'foobar' | pbcopy]
答案 2 :(得分:2)
你可能正在重新发明轮子。
IRB_Tools和Utility_Belt都用于调整IRB,提供了使用剪贴板的功能。两者都是现有宝石的集合,因此我使用gem clipboard -r
进行了快速搜索,并提出了:
clipboard (0.9.7)
win32-clipboard (0.5.2)
查看RubyDoc.info的clipboard揭示:
剪贴板
访问剪贴板,无需关心操作系统是Linux,MacOS还是Windows。
用法
你有Clipboard.copy,
Clipboard.paste和
Clipboard.clear
玩得开心;)
编辑:如果您检查链接页面上的来源,对于Mac,您会看到要复制的内容:
def copy(data)
Open3.popen3( 'pbcopy' ){ |input,_,_| input << data }
paste
end
对于粘贴,你会看到:
def paste(_ = nil)
`pbpaste`
end
并且简单明了:
def clear
copy ''
end
那些应该让你指向正确的方向。
答案 3 :(得分:1)
这可能看起来像一个丑陋的解决方法,但我很确定它会起作用:
创建一个名为myfoobar.sh的可执行文件,其中包含您要执行的行。
#! /bin/sh
echo -n foobar | pbcopy
然后从ruby调用该文件。
答案 4 :(得分:0)
使用sutil进行正确设置:
$ ssh-copy-id user@host