Bash:可以在执行前更改命令

时间:2012-09-10 04:23:27

标签: bash terminal command-line-arguments bsd getopt

我想更改命令,以便在命令行参数之前放置命令行标志(选项),这是由GNU getopt自动完成的。

Mac使用BSD getopt以便缺少功能。我想调整bash,以便在执行一个命令时,运行一个解析标志和参数的脚本重新排序它们并执行重新排序的命令。

这样,两者都

ls -lh /tmp
ls /tmp -lh

可以在我的Mac终端上使用。

1 个答案:

答案 0 :(得分:2)

除非您知道每个命令的optstring函数的getopt()参数是什么,否则您无法安全地编写通用工具来执行在命令行上重新排序参数的工作。考虑:

make something -f makefile
cp   something -f makefile

在第一个命令中,您必须将-fmakefile都移到前面以规范化命令调用。在第二个中,您只能移动-f;如果您也移动以下文件名,则重写命令并销毁数据。

当然,如果命令采用长格式getopt_long()--force样式参数,您还必须知道--file=makefile参数字符串是什么样的。

坦率地说,你最好在你的Linux环境中使用POSIXLY_CORRECT,忘记它提供的阴险灵活性,并学习在你的论点之前随时编写你的选择。如果你这样做,你的代码将更好地适用于所有类Unix机器。


您可以在/bin/usr/bin之外的某个目录中安装GNU软件(例如/usr/gnu/bin,然后确保在系统目录之前将/usr/gnu/bin放在PATH上还有预先构建的系统,如fink。然而,这对于没有GNU类似物的Apple工具也无济于事。而且你写的shell脚本不会有“危险”。可以移植到其他没有相同设置的Mac上。