在Ruby中使用backticks和管道
在ruby脚本中使用shell命令时会出现此错误。这些命令不会像bash终端中那样执行 前两个命令合理,第三个命令不合理在Ruby中使用backticks和管道,ruby,bash,piping,backticks,Ruby,Bash,Piping,Backticks,在ruby脚本中使用shell命令时会出现此错误。这些命令不会像bash终端中那样执行 前两个命令合理,第三个命令不合理 `echo foo` # => "foo\n" `echo -n foo` # => "foo" `echo -n foo | cat` # => "-n foo\n" 在bash中,我们将有以下内容: $ echo foo # => "foo\n" $ echo -n foo # => "foo" $ echo -n foo | cat #
`echo foo` # => "foo\n"
`echo -n foo` # => "foo"
`echo -n foo | cat` # => "-n foo\n"
在bash中,我们将有以下内容:
$ echo foo # => "foo\n"
$ echo -n foo # => "foo"
$ echo -n foo | cat # => "foo"
在Ruby命令中,有没有一种方法会弄乱传递给调用
echo
的参数?如果您不熟悉,则命令echo将返回给定的字符串。如果没有-n
标志,它会附加一个换行符,当您添加-n
时,它不会cat
重复给定的任何内容。首先,Ruby使用/bin/sh
,而不是bash
,作为back tick操作符。很可能在您的系统上,/bin/sh
是指向/bin/bash
的链接,但是bash
在作为sh
调用时的行为不同,以便更好地遵守POSIX。然而,正如您的示例所示,它并不完美。POSIX规范规定,echo
“不支持任何选项”,但将初始参数-n
的处理留给具体实现
在使用/bin/sh
链接到/bin/bash
的快速测试中,
bash-c“echo-n foo”
和bash-c“echo-n foo | cat”
产生了相同的、没有换行的结果,但是sh-c“echo-n foo”
和sh-c“echo-n foo | cat”
显示了您报告的结果。(我不确定其他shell,例如ksh
、dash
或zsh
在作为sh
调用时的行为,但默认情况下它们都将-n
视为换行抑制器。)
要获得可预测的结果,请改用printf
,除非格式字符串中包含\n
,否则它不会打印换行符
printf 'foo\n'
printf 'foo'
printf 'foo' | cat
更新:这似乎是bash3.2中的一个bug,它在4.x系列中的某个时候被修复了。对于4.1或更高版本,
sh-c“echo-n foo | cat
和sh-c“echo-n foo”
产生相同的输出。ruby-e'a=`echo-n foo | cat`;print a'
在这里工作正常!@gniouf gniour如果它取决于shell用于/bin/sh
。