如何使点文件与系统无关?


21

由于工作量,我最近开始使用OS X,并使用自制软件进行了设置,以获得与Linux类似的体验。

但是,它们的设置有很多差异。有些只需要在一个系统上就位。当我的点文件位于git存储库中时,我想知道可以设置哪种开关,以便仅对Linux系统和OS X读取某些配置。

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


我用git分支做到了。我有一个FreeBSD,Gentoo和Ubuntu。但这并不理想。
拉斐尔·阿伦斯

@RaphaelAhrens我想避免这种基于分支的解决方案,因为它容易产生分歧。
k0pernikus

是的,当您将系统特定的内容放入特殊文件中时,可以使其变得更容易。但是正如我所说的不理想。
拉斐尔·阿伦斯


我的方法基本上可以归结为if (exists rcfile.local); source rcfile.local; endif,翻译为相应的rc文件。我尝试使用主rc文件来保持系统不可知性,而该.local版本具有系统特定的设置。如果要在一个仓库中全部保存,则可以使用系统目录并将rcfile.local符号链接到正确目录中的目录。
jw013 2013年

Answers:


22

使点文件尽可能地可移植,并避免依赖于OS的设置或要求特定工具版本的开关,例如,如果您未在所有系统上都使用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

uname -s就像uname。uname代表Unix名称。
斯特凡Chazelas

1
@StephaneChazelas碰巧是这样,还是可以保证跨系统运行,我可以随时删除-s
Marco Marco

1
是的,uname几十年来,光靠这种方式已经成为规范的方式,并且由POSIX指定。原始文件uname(在PWB Unix中)没有任何选择。
斯特凡Chazelas

@StephaneChazelas感谢您的澄清,我-s从这个答案中删除了,我会在以后的脚本中牢记这一点。
Marco

这是一个相对较小的细节,不会影响您的示例所说明的内容,但是vimrc中的引号set真的应该是U + 201C和U + 201D而不是U + 0022吗?
CVn

3

如果您只关心实际执行的文件,例如.bash_profiles和friends,则可以使用eg uname来区分基于代码运行的系统。

例如,如果您当前使用的是Linux,则完全未经测试,并且警告我没有OS X可以尝试:

alias ll='ls -lFA'

在Mac OS X上:

alias ll='ls -lFAx'

(在默认情况下,-xOS X会ls执行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-γ和uname -S命令由POSIX要求(感谢马可指出这点)),并且该语法shell脚本分支基于字符串的比较是相同的。您可能还可以根据其他条件进行测试。例如,您可以查找/ etc / lsb_release,检查/ proc / sys / kernel / ostype是否包含“ Linux”,或者可以进行其他任何测试。


@RaphaelAhrens是的Darwin,我刚刚检查了一下。
k0pernikus

@RaphaelAhrens就像我写的一样,我没有OS X可以尝试,所以我大胆地猜测来展示这个想法,而不是花大量时间在OP可以轻易发现的一个相对无关紧要的细节上。
CVn 2013年

如果有人希望在Windows或其他平台上使用bash,请在Wikipedia上进行救援:en.wikipedia.org/wiki/Uname
拉斐尔·阿伦斯

1
uname -o开关不是POSIX,并且在许多系统(例如Solaris)上失败。-s在POSIX上是必需的,并且是最兼容的方式。IEEE Std 1003.1
Marco

2
OSTYPE在POSIX shell中不可用。例如,它将在默认的FreeBSD安装上失败,并且只能在.bashrc或中使用.zshrc。在.profile.alias等中它不能可靠地工作。由于我们在这里谈论兼容性,所以我建议您采用一种安全的方法,而不要依赖于不能保证在每个系统上都可用的特定Shell功能。
Marco Marco
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.