在多个UNIX环境中处理PATH的最佳/传统方法

时间:2010-10-08 06:59:29

标签: bash unix scripting multiplatform

这里的主要问题是:是否有一种编写可在多个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

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

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是完成简单任务的最简洁实用的方法。

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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

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

如果您知道可以在不同的Unix系统中使用Bash,则可以使用shell builtins而不是外部命令来提高可移植性。例如:

help type
type -a type

type -P ls  # replaces: which ls

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

help command

command ls -l

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