Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby中使用backticks和管道_Ruby_Bash_Piping_Backticks - Fatal编程技术网

在Ruby中使用backticks和管道

在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 #

在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 # => "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