2016-12-25 70 views
2

在bash 3.2(默认情况下,最近的MacOS),运行printf "-1"给我一些错误是这样的:printf的“-1”在bash给出错误原因不明

bash: printf: -1: invalid option 

这我倒没有问题zsh,实际上,任何传递给printf的字符串中的前导连字符都会触发该错误。 shellcheck对此没有警告。也试过echo "-1",看起来不错。

我知道错误是可以通过使用printf "%s" "-1"避免的,但有人可以解释其背后的原因吗?谢谢。

+0

你试过'/ usr/bin/printf -1'吗? –

回答

2

对于符合标准语法的实用程序(echo是一个显着的例外),以-开头的主要操作数指示选项。即使命令没有提供这些名称的选项,操作数也会被视为选项,导致您看到的错误消息。可以用--指示选项的明确结尾:printf -- -1将导致字符串-1被解释为格式字符串并被打印。

+0

我在命令中加了双引号-1,所以它不应该再作为选项处理?我猜。另外,zsh似乎很好,所以我不知道它是否是bash中的东西。 – Lin

+0

@Lin引用在命令看到之前由shell处理,并且永远不会将选项视为非选项。即使该命令是作为内置的shell实现的。用'sed'试试它:'echo abc | sed“-es/b/d /”'。我不知道zsh做了什么,我知道bash在这里按照标准处理'printf'。 – hvd

+0

@Lin可能zsh根本没有为'printf'提供任何选项,并因此决定跳过实现选项解析。 – hvd