24

我想让我的 bash 脚本处理长参数。我找到getopt了,但 OS X 不支持它。谁能告诉我为什么getopt由 BSD 实现,而不是 GNU?我尝试getopt在 GNU C lib 中构建,但由于我对 Linux 的技能不佳而失败了。

有人做过这项工作吗?

4

3 回答 3

28

有一个用于 getopt 的酿造瓶

跑吧brew install gnu-getopt

您可以指定它的路径,例如 /usr/local/Cellar/gnu-getopt/1.1.6/bin/getopt

或者使用brew link --force gnu-getopt所以它将被链接到/usr/local/bin/

请注意,强制链接可能会损坏您的系统(因为它用 gnu 替换了系统 getopt)。

另请参阅建议定义的其他答案FLAGS_GETOPT_CMD

于 2016-05-27T14:07:51.013 回答
17

我建议使用 Homebrew 安装gnu-getopt,然后添加$FLAGS_GETOPT_CMD到您的~/.bash_profile文件中以指定 getopt 的 cmd 路径,指向 homebrew 位置,如下所示:

brew install gnu-getopt

然后按照 brew 的说明添加到本地路径:

sudo echo 'export PATH="/usr/local/opt/gnu-getopt/bin:$PATH"' >> ~/.bash_profile

然后你可以添加FLAGS_GETOPT_CMD

sudo echo 'export FLAGS_GETOPT_CMD="$(brew --prefix gnu-getopt)/bin/getopt"' >> ~/.bash_profile

打开一个新终端,或. ~/.bash_profile在现有终端中运行以加载更改

运行echo $FLAGS_GETOPT_CMD以确认它实际上是在您的控制台中设置的

于 2017-11-28T23:46:29.693 回答
2

改用它通常是一个更好的主意getopts,并坚持使用短选项。你可以在这个 StackOverflow Q&A中看到 getopts 的作用。短选项在整个 OSX 命令行工具中更加标准,并且一致性是一件好事。

此外,getopts 内置在 bash 中,因此它绝对可以在 OSX 以及所有其他可以运行 bash 的平台中使用。

请注意,getopt在 OSX 中也有一个。在终端中,键入man getopt以查看其文档。它不支持长选项。这是在编写工具以在 OSX 上运行时不使用长选项的一个很好的理由。

如果你想这样做,你可以getoptmacports安装。或者,如果您想要更好的可移植性,您可以滚动自己的长参数处理。

发布一些代码,我们将帮助调试它。

于 2012-08-28T03:12:30.677 回答