gpt4 book ai didi

ruby - 在 Ruby 中使用反引号和管道

转载 作者:数据小太阳 更新时间:2023-10-29 08:22:57 26 4
gpt4 key购买 nike

在 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 作为反引号运算符。在您的系统上,/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,例如 kshdashzsh 在作为 sh,但默认情况下它们都将 -n 视为换行抑制器。)

为了获得可预测的结果,请改用 printf,除非格式字符串中包含 \n,否则永远不会打印换行符。

printf 'foo\n'
printf 'foo'
printf 'foo' | cat

更新:这似乎是 bash 3.2 中的一个错误,已在 4.x 系列的某个时间点修复。对于 4.1 或更高版本,sh -c "echo -n foo | catsh -c "echo -n foo" 产生相同的输出。

关于ruby - 在 Ruby 中使用反引号和管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23230399/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com