我有相当广泛的点文件选择,它们在 git repo 中保存了很长时间 - 我只为 bsd-isms 维护一个单独的代码分支(例如,在 Linux 上,要获得彩色的 ls 输出你需要这样做ls --color=auto
,但在包括 Mac OS 在内的 BSD 类系统中,则是ls -g
)。
这已经开始变得难以处理,因为每次我接触 shell 的 rc 文件时,我都必须进行更改,然后合并分支并解决冲突。我认为处理这个问题的正确方法是删除 git 分支,只需让我的 rc 文件确定它在哪种操作系统上,然后为别名提供适当的插件脚本。
问题是,我不知道该怎么做。
如何从脚本或 shell rc 文件中判断我是在 Linux 还是 BSD 上?
uname
不会真正起作用,因为那时我必须为各种系统编写一堆逻辑。Mac 说 Darwin、FreeBSD 等,而我更感兴趣的是底层操作系统类型因为这会影响我所处理的特定工具集。对于上面的例子,我使用的是 bsdls
还是 GNU ls
?
答案1
Stack Overflow 上的这个答案经过尼古拉斯·马尔蒂亚诺夫提供了完整的解决方案。我对其进行了调整,以使用评论中提到的较新的语法。
确定操作系统:
platform='unknown'
unamestr=$(uname)
if [ "$unamestr" = 'Linux' ]; then
platform='linux'
elif [ "$unamestr" = 'FreeBSD' ]; then
platform='freebsd'
fi
选择正确的标志ls
:
if [ "$platform" = 'linux' ]; then
alias ls='ls --color=auto'
elif [ "$platform" = 'freebsd' ]; then
alias ls='ls -G'
fi
答案2
除了平台检测(通过正确完成uname
)之外,不仅需要正确选择标志,还需要选择可执行文件的路径。
调用只是ls -G
意味着给我任何在 $PATH 中找到的别名/函数/可执行文件,并使用标志运行它-G
。该别名/函数/可执行文件在 BDS OS 上可能是也可能不是 BSD,可能遵循也可能不遵循 BDS 参数,可能是也可能不是您期望的完全相同的版本,等等。
因此,人们会使用内置可执行文件的完整路径,该路径很有可能(摆弄系统级并不像摆弄别名/函数/$PATH 那么常见)遵循操作系统:/bin/ls -G
。