我想更改命令,以便将命令行标志(选项)放在命令行参数之前,这是由 GNU getopt 自动完成的。
Mac 使用 BSD getopt,因此缺少该功能。我想调整 bash,以便在执行一个命令时,我运行一个脚本来解析标志和参数,重新排序它们并执行重新排序的命令。
这样一来,双方
ls -lh /tmp
ls /tmp -lh
将在我的 Mac 终端上运行。
我想更改命令,以便将命令行标志(选项)放在命令行参数之前,这是由 GNU getopt 自动完成的。
Mac 使用 BSD getopt,因此缺少该功能。我想调整 bash,以便在执行一个命令时,我运行一个脚本来解析标志和参数,重新排序它们并执行重新排序的命令。
这样一来,双方
ls -lh /tmp
ls /tmp -lh
将在我的 Mac 终端上运行。
除非您知道每个命令optstring
的函数参数是什么样的,否则您无法安全地编写通用工具来完成在命令行上重新排序参数的工作。getopt()
考虑:
make something -f makefile
cp something -f makefile
在第一个命令中,您必须将-f
和都移到makefile
前面以规范化命令调用。在第二种情况下,您只能移动-f
; 如果您也移动以下文件名,您将重写命令并破坏您的数据。
当然,如果命令也采用长格式或样式参数,您还必须知道getopt_long()
参数字符串的外观。--force
--file=makefile
坦率地说,您最好在 Linux 上的环境中使用 POSIXLY_CORRECT,忘记它提供的隐蔽灵活性,并始终学会在您的论点之前编写您的选项。如果你这样做,你的代码将在所有类 Unix 机器上运行得更好。
您可以将 GNU 软件安装在除/bin
and之外的某个目录中/usr/bin
(例如/usr/gnu/bin
,然后确保/usr/gnu/bin
将 PATH 放在系统目录之前。也有类似的预构建系统fink
。但是,这对 Apple 提供的工具没有帮助没有来自 GNU 的类似物。还有一个“危险”,即您编写的 shell 脚本将无法移植到其他没有与您相同的设置的 Mac 上。