如何保持点文件与系统无关?

如何保持点文件与系统无关?

由于工作原因,我最近开始使用 OS X 并使用自制程序对其进行设置,以获得与 Linux 类似的体验。

然而,它们的设置有相当多的差异。有些只需要安装在一个系统上。由于我的点文件位于 git 存储库中,我想知道我可以设置什么样的开关,以便某些配置仅在 Linux 系统中读取,而其他配置则在 OS X 中读取。

至于点文件,我指的是.bash_profiles.bash_alias

答案1

保持点文件尽可能可移植,并避免依赖于操作系统的设置或需要特定版本工具的开关,例如,如果不在所有系统上使用 GNU 软件,请避免使用 GNU 语法。

您可能会遇到需要使用系统特定设置的情况。在这种情况下,请使用带有单独设置的 switch 语句:

case $(uname) in
  'Linux')   LS_OPTIONS='--color=auto --group-directories-first' ;;
  'FreeBSD') LS_OPTIONS='-Gh -D "%F %H:%M"' ;;
  'Darwin')  LS_OPTIONS='-h' ;;
esac

如果任意应用程序的配置文件需要不同的选项,您可以检查该应用程序是否提供兼容性开关或其他机制。例如vim,您可以检查版本和补丁级别以支持旧版本或使用不同功能集编译的版本所没有的功能。示例片段来自.vimrc

if v:version >= 703
  if has("patch769")
    set matchpairs+=“:”
  endif
endif

答案2

如果您只关心实际执行的文件,例如 .bash_profiles 等,那么您可能可以不用使用 eguname来根据代码运行的系统进行区分。

例如,完全未经测试,并且需要注意的是,如果您目前使用的是 Linux,我没有 OS X 来尝试:

alias ll='ls -lFA'

在 Mac OS X 上:

alias ll='ls -lFAx'

(其中-x使 OS Xls执行 GNU ls 默认执行的操作),那么它们可以组合成如下所示:

OS="$(uname -s)"
if test "$OS" = "Darwin"; then
    alias ll='ls -lFAx'
    # ...other OS X-specific things go here...
else if test "$OS" = "Linux"; then
    alias ll='ls -lFA'
    # ...other Linux-specific things go here...
fi
# ...generic things go here...

那么唯一的要求就是uname -s以几乎相同的方式工作(它应该是这样,因为两个系统都是合理的 POSIX-y 并且POSIX 需要 uname -s(谢谢马可为了指出这一点)),并且基于字符串比较的 shell 脚本分支的语法是相同的。您也可以根据其他标准进行测试;例如,您可以查找 /etc/lsb_release,检查 /proc/sys/kernel/ostype 是否包含“Linux”,或者您可以提出的任何其他测试。

相关内容