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

pol*_*lau 6 ruby macos shell

我想从Ruby运行以下shell命令,它将一个字符串复制到剪贴板(在OS X上),'n'是在字符串引起的字符串断点之后抑制echo:

echo -n foobar | pbcopy
Run Code Online (Sandbox Code Playgroud)

- > 工作,很好,现在剪贴板包含"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"
Run Code Online (Sandbox Code Playgroud)

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

mu *_*ort 7

你的问题-n只有bash内置echo命令才能理解; 当你说%x[...](或者你的任何其他变体)时,命令被输入到/bin/sh它将像POSIX shell一样,即使它确实如此/bin/bash.解决方案是将shell命令显式地提供给bash:

%x[/bin/bash -c 'echo -n foobar' | pbcopy]
Run Code Online (Sandbox Code Playgroud)

当然,您需要小心引用任何foobar实际情况.该-c开关基本上告诉/bin/bash你给它一个内联脚本:

-c string
如果存在-c选项,则从字符串中读取命令.如果字符串后面有参数,则将它们分配给位置参数,从$ 0开始.


Pau*_*ce. 6

因为echo在不同的shell和in中表现不同/bin/echo,所以建议您使用printf.

没有新行:

%x[printf '%s' 'foobar' | pbcopy]
Run Code Online (Sandbox Code Playgroud)

换行:

%x[printf '%s\n' 'foobar' | pbcopy]
Run Code Online (Sandbox Code Playgroud)