在bash中根据操作系统运行不同命令的最佳方法

4
在bash脚本中,是否存在一种“正式”的方法,可以根据操作系统版本运行不同的命令。我的意思是,在顶部设置一次,然后在其他所有地方以相同的方式调用它。 我已经尝试使用别名,但那似乎是个赌博,而且在某些系统上并不真正起作用(例如使用win-bash的Windows 7)。
例如,这是我尝试过的:
if [ "$(uname)" = "Darwin" ]; then
    alias p4cli=./bin/p4
else
    alias p4cli=C:\bin\p4.exe
fi

p4cli login

如果我使用shopt -s expand_aliases,那么它可以在Mac上运行,但win-bash没有shopt。我假设有比别名更好的方法来做到这一点?

对于这个特定的例子,在运行脚本之前正确设置PATH即可。 - tripleee
4个回答

4
为了确定bash中的基础操作系统,最好依赖于环境变量OSTYPE。bash手册指出,变量OSTYPE存储操作系统的名称:

OSTYPE自动设置为描述bash正在执行的操作系统的字符串。默认值取决于系统。

if [[ "$OSTYPE" == "darwin"* ]]; then
   p4cli="./bin/p4"
else
   p4cli="C:\bin\p4.exe"
fi

"$p4cli" login

2

使用变量,而不是别名。

if [ "$(uname)" = "Darwin" ]; then
    p4cli=(./bin/p4)
else
    p4cli=('C:\bin\p4.exe')
fi

"${p4cli[@]}" login

我们将变量设置为数组,这样如果需要,参数可以随后添加到命令中。


1

让调用p4cli的进程负责将正确的目录添加到其PATH变量中。然后,您只需要调用p4cli login而不必担心其确切位置。

可能,您会从特定于机器(或至少特定于操作系统)的.bash_profile中执行此操作,该文件可以直接编码正确的目录。


0

把命令保存在一个变量中怎么样?

if [ "$(uname)" = "Darwin" ]; then
    p4cli='./bin/p4'
else
    p4cli='C:\bin\p4.exe'
fi

$p4cli login

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接