3

这里的主要问题是:是否有编写可在多个 UNIX 平台上运行的 UNIX shell 脚本的标准方法。

例如,我们有许多主机运行不同风格的 UNIX(Solaris、Linux)和不同的版本,所有这些主机的文件系统布局都略有不同。有些主机在 /usr/local/gnu/bin/ 中有 whoami,有些在 /usr/bin/。

我们所有的脚本似乎都以稍微不同的方式处理这个问题。有些人对架构有案例陈述:

case "`/script/that/determines/arch`" in 
  sunos-*) WHOAMI=`/usr/local/gnu/bin/whoami` ;;
  *)       WHOAMI=`/usr/bin/whoami` ;;
esac

使用这种方法,您可以确切地知道正在执行什么二进制文件,但是如果有很多命令正在执行,那就很麻烦了。

有些只是设置PATH(基于上面的 arch 脚本)并仅通过它们的名称调用命令。这很方便,但是您无法控制运行哪个命令,例如,如果您有:

/bin/foo
/bin/bar
/other/bin/foo
/other/bin/bar

您将无法同时使用/bin/foo/other/bin/bar

我能想到的另一种方法是在每个主机上都有一个本地目录,其中包含每个主机上需要的每个二进制文件的符号链接。例如:

Solaris 主机:

/local-bin/whoami -> /usr/local/gnu/bin/whoami
/local-bin/ps -> /usr/ucb/ps

Linux主机:

/local-bin/whoami -> /usr/bin/whoami
/local-bin/ps -> /usr/ps

人们还使用哪些其他方法?请不要只说用 Python 编写脚本……在某些任务中,bash 是完成简单任务的最简洁实用的方法。

4

2 回答 2

4

我将所有这些委托给我的 .profile,它具有一系列精心设计的内部函数,可以尝试将可能的目录添加到 PATH 中。除了在 OSX 上,我认为这基本上是不可能的,因为 Darwin/Fink/Ports 都想控制你的 PATH,这种方法效果很好。

如果我关心歧义(fooPATH 上不同目录中的多个实例),我会修改函数以识别所有歧义命令并需要手动解析。但对于我的环境,这从来都不是问题。我主要关心的是拥有一个在 Debian、Red Hat、Solaris、BSD 等上运行的单一 .profile。“尝试每个可能工作的目录”方法效果很好。

于 2010-10-08T07:54:23.510 回答
0

要将 PATH 设置为符合 POSIX 的目录,您可以在 Bash 脚本的开头执行以下操作:

unset PATH
PATH="$(PATH=/bin:/usr/bin getconf PATH)"
export PATH

如果您知道可以在不同的 Unix 系统上使用 Bash,那么您也可以使用 shell 内置命令而不是外部命令来提高可移植性。例子:

help type
type -a type

type -P ls  # replaces: which ls

要在 Bash 中禁用诸如 find、ls、...等命令的别名/函数查找,您可以使用内置命令。例子:

help command

command ls -l

如果您想 100% 确定执行位于特定目录中的特定命令,那么使用完整的可执行路径似乎是可行的方法。第一场比赛在 PATH 查找中获胜!

于 2010-10-08T17:33:45.757 回答