如何在mac中使用"getopt"命令进行bash处理长参数?

qiu*_*ian 19 macos bash gnu

我想让我的bash脚本处理长参数.我找到了getopt,但它在OS X中不受支持.任何人都可以告诉我为什么getoptBSD实现了,而不是GNU?我尝试getopt在GNU C lib中构建,但由于我在Linux上的技能不佳而失败了.

有人做过这项工作吗?

Den*_*aud 22

getopt有一个brew瓶.

只要运行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.

  • 如果你想使用 `brew` 用于其他 GNU coreutils 的 `g` 前缀,你可以将其添加到你的 `.bash_profile` 中: `if [[ -x /usr/local/Cellar/gnu-getopt/1.1 .6/bin/getopt]]; 然后别名 ggetopt=/usr/local/Cellar/gnu-getopt/1.1.6/bin/getopt; 菲` (2认同)
  • 我无法链接它,它会转储`echo 'export PATH="/usr/local/opt/gnu-getopt/bin:$PATH"' >> ~/.zshrc`。我运行了命令,它仍然转储同样的事情。有什么建议吗? (2认同)

sMy*_*les 7

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

brew install gnu-getopt
Run Code Online (Sandbox Code Playgroud)

然后按照brew的指示添加到您的本地路径:

sudo echo 'export PATH="/usr/local/opt/gnu-getopt/bin:$PATH"' >> ~/.bash_profile
Run Code Online (Sandbox Code Playgroud)

然后,您可以添加FLAGS_GETOPT_CMD

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

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

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

  • 我喜欢人们投反对票,但对于为什么提供零评论...... tsk tsk (2认同)

gho*_*oti 3

一般来说,最好使用getopts替代方案,并坚持使用简短的选项。您可以在此 StackOverflow 问答中看到 getopts 的实际应用。短选项在整个 OSX 命令行工具中更为标准,并且一致性是一件好事。

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

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

如果您无论如何都想这样做,可以getoptmacports安装。或者,如果您想要更好的可移植性,您可以进行自己的长参数处理。

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

  • 简短的选项往往难以阅读,尤其是当选项很多时。想使用它们是完全合理的。 (4认同)
  • 什么是“在编写工具时不使用长选项的充分理由”? (2认同)