bash - 如何检查是否在 Cygwin、Mac 或 Linux 中运行?

标签 bash shell cross-platform cygwin

我有一个在 Windows/Cygwin 以及 Mac 和 Linux 上都使用的 shell 脚本。每个版本需要的变量略有不同。

shell/bash 脚本如何检测它是在 Cygwin、Mac 还是 Linux 中运行?

最佳答案

通常,uname 及其各种选项会告诉您正在运行的环境:

pax> uname -a
CYGWIN_NT-5.1 IBM-L3F3936 1.5.25(0.156/4/2) 2008-06-12 19:34 i686 Cygwin

pax> uname -s
CYGWIN_NT-5.1

并且,根据非常有帮助的 schot(在评论中),uname -s 为 OSX 和 Linux 提供了 Darwin 用于 Linux,而我的 Cygwin 提供 CYGWIN_NT-5.1。但是您可能必须尝试各种不同的版本。

因此,执行此类检查的 bash 代码如下:

unameOut="$(uname -s)"
case "${unameOut}" in
    Linux*)     machine=Linux;;
    Darwin*)    machine=Mac;;
    CYGWIN*)    machine=Cygwin;;
    MINGW*)     machine=MinGw;;
    *)          machine="UNKNOWN:${unameOut}"
esac
echo ${machine}

请注意,我在这里假设您实际上是在 CygWin(它的 bash shell)中运行,因此应该已经正确设置了路径。正如一位评论者所说,您可以运行 bash 程序,从 cmd 本身传递脚本,这可能会导致路径未按需要设置。

如果您正在这样做,您有责任确保调用正确的可执行文件(即 CygWin 的),可能通过事先修改路径或完全指定可执行文件位置(例如, /c/cygwin/bin/uname).

关于bash - 如何检查是否在 Cygwin、Mac 或 Linux 中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3466166/

相关文章:

仅 C++ 前端编译器(将 C++ 转换为 C)

linux - Makefile 'ifneq' 语法错误,Broadcom BCM43142

bash - 更改 `uniq -c` 输出中的列顺序

Bash:路径为\

linux - 循环遍历多个目录的 bash 脚本的输出

linux - 用于迭代目录内容的 Bash 脚本仅移动当前未被其他进程打开的文件

bash - 在脚本中回显 $PS1

shell - shell 脚本中的 ${variable_name} 和 $variable_name 有什么区别

linux - Windows 开发人员如何最轻松地让他的软件在 Wine 下运行良好

c# - 来自 C# 的 Unix 命令