Bash 在多个UNIX环境中处理路径的最佳/常规方法

Bash 在多个UNIX环境中处理路径的最佳/常规方法,bash,unix,scripting,multiplatform,Bash,Unix,Scripting,Multiplatform,这里的主要问题是:是否有一种标准的方法来编写在多个UNIX平台上运行的UNIX shell脚本 例如,我们有许多主机运行不同风格的UNIX(Solaris、Linux)和不同版本,所有这些主机的文件系统布局都略有不同。有些主机在/usr/local/gnu/bin/中有whoami,有些主机在/usr/bin/中有whoami 我们所有的脚本似乎都以稍微不同的方式处理这个问题。一些案例说明了体系结构: case "`/script/that/determines/arch`" in sun

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

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

我们所有的脚本似乎都以稍微不同的方式处理这个问题。一些案例说明了体系结构:

case "`/script/that/determines/arch`" in 
  sunos-*) WHOAMI=`/usr/local/gnu/bin/whoami` ;;
  *)       WHOAMI=`/usr/bin/whoami` ;;
esac
使用这种方法,您可以确切地知道正在执行的是什么二进制文件,但是如果执行的命令很多,那么它就相当麻烦了

有些人只需设置
路径
(基于上面的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是完成简单任务的最简洁实用的方法。

我将所有这些都委托给我的.profile,它有一系列复杂的内部函数,可以尝试将可能的目录添加到路径中。除了在OSX上,我认为这基本上是不可能的,因为Darwin/Fink/Ports都希望控制您的路径,这种方法已经足够有效了


如果我关心模糊性(路径上不同目录中的多个
foo
),我会修改函数,以便识别所有模糊命令并需要手动解决。但对我的环境来说,这从来都不是一个问题。我主要关心的是在Debian、Red Hat、Solaris、BSD等平台上运行一个.profile。“尝试每个可能工作的目录”方法工作得很好。

要设置与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
help command

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

help type
type -a type

type -P ls  # replaces: which ls
help command

command ls -l

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

这并不理想,但我想这可能是所有缺点中最好的一个。为了澄清,我们使用sudo运行了很多命令,在我们的环境中,这不会导致读取模拟用户的.profile。我不确定这是否就是sudo的工作原理,或者我们是否没有正确设置。