如何确定 .bash_profile 中的操作系统?

如何确定 .bash_profile 中的操作系统?

在我的主机 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.

相关内容