这里的主要问题是:是否有一种编写可在多个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是完成简单任务的最简洁实用的方法。
答案 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查找中获胜!