【问题标题】:Bash: Is it possible to change command before executionBash:是否可以在执行前更改命令
【发布时间】:2012-09-02 22:38:55
【问题描述】:

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

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

这样,两个

ls -lh /tmp
ls /tmp -lh

可以在我的 Mac 终端上运行。

【问题讨论】:

  • 如果有 3 个或更多选项 cp -R /root /bkp,您会假设什么样的顺序变化
  • 现在我想了想,您知道您可以通过 coreutils macport macports.org/ports.php?by=name&substr=coreutils(可能还有其他)在您的 Mac 上获得很多 GNU 工具吗?也许这可以帮助你的努力。
  • @Mat,我认为替换它们既乏味又危险。此外,它不适用于其他依赖 BSD getopt 的可执行文件。我正在考虑构建一个执行重新排序然后调用 bash 的 shell。

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


【解决方案1】:

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

make something -f makefile
cp   something -f makefile

在第一个命令中,您必须将-fmakefile 都移到前面以规范化命令调用。在第二种情况下,您必须只移动-f;如果你也移动了以下文件名,你会重写命令并破坏你的数据。

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

坦率地说,您最好在 Linux 上的环境中使用 POSIXLY_CORRECT,忘记它提供的隐蔽灵活性,并始终学会在您的论点之前编写您的选项。如果你这样做,你的代码将更好地在所有类 Unix 机器上运行。


您可以将 GNU 软件安装在 /bin/usr/bin 以外的某个目录中(例如 /usr/gnu/bin,然后确保将 /usr/gnu/bin 放在系统目录之前的 PATH 中。有预构建的系统,例如fink 也是如此。但是,这对来自 Apple 的工具没有帮助,这些工具没有来自 GNU 的类似物。而且还有一个“危险”,即您编写的 shell 脚本将无法移植到其他没有和你一样的设置。

【讨论】:

    猜你喜欢
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多