Ruby:使用'-n'选项执行shell命令'echo'

时间:2011-02-20 18:29:19

标签: ruby macos shell

我想从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"

实现这一目标的正确方法是什么?

5 个答案:

答案 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