2012-09-10 58 views
0

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

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

这样,既

ls -lh /tmp 
ls /tmp -lh 

会在我的Mac的终端工作。

+0

什么样的订单改变你假设3个或更多的选项'cp -R/root/bkp'例如 – triclosan

+1

假设我现在关于它,你知道你可以通过coreutils macport http://www.macports.org/ports.php?by=name&substr=coreutils(也可能是其他人)在Mac上获得很多GNU工具吗?也许这可以帮助你做出努力。 – Mat

+0

@Mat,我认为替换它们是很乏味和危险的。此外,它不会与依赖于BSD getopt的其他可执行文件一起工作。我正在考虑构建一个执行重新排序的shell,然后调用bash。 – luanjunyi

回答

2

除非您知道getopt()函数的optstring参数对于每个命令的外观,否则无法安全地编写通用工具来执行重新排序命令行参数的工作。试想一下:

make something -f makefile 
cp something -f makefile 

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

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

坦率地说,你最好在你的Linux环境中使用POSIXLY_CORRECT,忘记它提供的灵活的灵活性,并学习在任何时候在你的论点之前写下你的选项。如果你这样做的话,你的代码可以在所有类Unix机器上更好地工作。


你可以比/bin/usr/bin(如/usr/gnu/bin一些其他目录下安装GNU软件,然后确保你把/usr/gnu/bin PATH中领先于系统目录中。还有像fink预建的系统了。然而,这对于那些没有GNU类似物的工具没有任何帮助,而且你写的shell脚本不能移植到其他与你没有相同设置的Mac上。

相关问题