【问题标题】:macos command line params not working at the endmacos命令行参数最后不起作用
【发布时间】:2017-12-06 21:18:51
【问题描述】:

在 Linux 系统上,当您在 rm * -rf 之类的 shell 中键入命令时,*-rf 的顺序无关紧要。我的 shell 以同样的方式解释它。现在,在我的 Mac 上,当我输入 rm -rf * 时,一切正常,但如果我输入 rm * -rf,则会出现错误 rm: -rf: No such file or directory

我在 macOS 和带有 fish 和 bash shell 的 linux 上进行了尝试。同样的问题。

有谁知道为什么 macOS 上的命令解释器认为命令末尾的 -rf 没有被解释为命令的参数?

【问题讨论】:

  • 不同的不是命令解释器(shell);它是rm 命令。传统上,Unix 命令要求所有选项在任何非选项参数之前。 GNU 实用程序和那些以 GNU 风格编写的实用程序允许混合使用选项和非选项参数。 OSX 是 BSD 的衍生产品,表现出更传统的行为。

标签: linux bash macos shell args


【解决方案1】:

这不是关于外壳,而是关于命令。 命令行参数的解析不是 shell 的功能和职责,而是实际命令的功能。 在这两个系统中,shell 都会按照指定的顺序忠实地传递命令行参数,然后由命令的实现来按照它们认为合适的方式解析它们。

在 linux 中,核心实用程序通常是 GNU 实现的, 而在 osx 上,核心实用程序通常是 BSD 实现。

命令的man 页面应该告诉您它是哪个实现。

例如,Linux 中man rm 的最后一行是这样的:

GNU coreutils 8.21                March 2016                             RM(1)

在 osx 上:

BSD                            January 28, 1999                            BSD

【讨论】:

    【解决方案2】:

    过去,任何 shell 中的参数顺序都与 unix 相关。

    rm 顺便还有一个选项——停止解析选项(例如能够删除以“-”开头的文件)

    参见 rm(1) 和 getopt(3) 手册页

    如果 shell 不尊重参数的顺序,它会给出这个序列的结果:

    $ touch a b 
    $ mv a b 
    

    什么文件会保留?

    【讨论】:

      猜你喜欢
      • 2012-11-28
      • 2017-06-19
      • 2013-06-05
      • 2022-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      相关资源
      最近更新 更多