在 shell 配置脚本中,与 GNU 相比,我如何解释 BSD 上的 coreutils 之间的差异?

lab*_*nth 9 bash bsd gnu bashrc

直到本月,我的 shell 配置都非常简单(主要只是一个.bashrc.bash_profile一些别名),但我一直在重构它,因此我可以根据我是否使用 zsh 和 bash 来获得不同的行为。他们首先提供一个通用的 shell 配置文件,该文件应该适用于任何情况,然后专门用于正在使用的特定 shell(我对此进行了符号链接)。

今天ls停止工作时我很惊讶。原来,在重构过程中.bashrc,有一个别名

alias ls='ls --color=always'
Run Code Online (Sandbox Code Playgroud)

ls在 OSX 终端上的 bash 中破坏了东西。一旦我看到 BSDls喜欢-G颜色,但 GNU(或 Ubuntu 上的任何东西)喜欢--color,很明显有很多选项不同。

我的问题是,解决 BSD 和 GNU coreutils 之间的选项差异以及诸如此类差异的最佳方法是什么?我应该在if块中测试环境变量以查看正在使用的操作系统并应用正确的行为吗?还是为每个操作系统制作单独的配置文件更有意义?

虽然对这些问题的回答可能是主观的,但对 BSD 和 GNU coreutils 之间的差异范围的概述以及解决这些问题以使通用配置可用于大多数 *nix 的策略似乎是相当客观的。

jor*_*anm 9

编写支持不同操作系统的脚本的唯一可靠方法是仅使用 POSIX 定义的功能。

对于诸如个人 shell 配置之类的事情,您可以使用适合您特定用例的技巧。像下面这样的东西是丑陋的,但会实现目标。

if ls --version 2>/dev/null | grep -q 'coreutils'; then
    alias ls='ls --color=always'
else
    alias ls='ls -G'
fi
Run Code Online (Sandbox Code Playgroud)

  • 与其明确地寻找`coreutils`,为什么不测试颜色标志是否有效,例如`if ls --color=auto -d / >/dev/null 2>&1; 然后……`。 (3认同)