在我的主机 MacBook Pro 上,我有一个.bash_profile
文件,我想在我的 Dreamhost Linux 机器上使用不改变的文件。但是,有几行仅适用于 macOS,例如alias mvim="/Applications/MacVim.app/Contents/MacOS/MacVim"
.
bash 有没有办法测试它是否在 macOS 或 Debian(或者只是不是 macOS)下运行,并且在 macOS 下运行时仅执行上面的行以及其他一些行?虽然这里的其他问题涉及如何找出正在使用哪个 Linux 发行版,但这里我只需要知道我是在 macOS 还是 Linux 上运行,并且在 macOS 上不提供了解 Linux 发行版的解决方案。
答案1
在 OSX 上,uname -s
返回Darwin
(大多数 Linuxuname
程序返回Linux
)。
作为一般规则(除了个人使用),uname
不同的系统有其怪癖。在 中autoconf
,脚本使用config.guess
,它提供了一致的信息。
例如在我的 Debian 7 中,
x86_64-pc-linux-gnu
在 OSX 中埃尔卡皮坦
x86_64-apple-darwin15.5.0
您可以在 shell 中使用 if-then-else 语句或 case 语句。后者更容易维护,例如,
case $(config.guess) in
*linux*)
DoSomeLinuxStuff
;;
*apple-darwin*)
DoSomeMacStuff
;;
esac
许多 Linux 发行版都会向 的输出添加信息uname
,但这仅在具体情况下有用。有不所添加信息的标准。
对于我的 Debian 7:
$ uname -v
#1 SMP Debian 3.2.81-1
而 OSX 则完全不同:
$ uname -v
Darwin Kernel Version 15.5.0: Tue Apr 19 18:36:36 PDT 2016; root:xnu-3248.50.21~8/RELEASE_X86_64
进一步阅读:
答案2
if [[ $(uname -s) == Linux ]]
then
doThis
else
doThat
fi
答案3
作为替代解决方案,您可以尝试将其分为.bash_profile
可移植部分和特定于系统的部分。
在你的 main 中.bash_profile
添加以下内容:
if [ -f ~/.bash_profile_local ] ; then
. ~/.bash_profile_local
fi
然后将仅适用于给定系统的任何自定义设置放入.bash_profile_local
该系统上。如果您没有自定义,则不必创建该文件。
或者,如果您想更进一步并在某些系统之间共享某些部分而不是在其他系统之间,您可以创建一个完整的 SYSV 风格的 rc.d 目录。在.bash_profile
:
if [ -d ~/.bash_profile.d ] ; then
for f in ~/.bash_profile.d/* ; do
if [ -f "$f" ] ; then
. "$f"
fi
done
fi
然后创建一个.bash_profile.d
目录,您放入其中的任何文件都将像您的.bash_profile
.