【问题标题】:Best/conventional method of dealing with PATH on multiple UNIX environments在多个 UNIX 环境中处理 PATH 的最佳/常规方法
【发布时间】:2011-04-22 17:54:41
【问题描述】:

这里的主要问题是:是否有编写可在多个 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 是完成简单任务的最简洁实用的方法。

【问题讨论】:

    标签: bash unix scripting multiplatform


    【解决方案1】:

    要将 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 查找中的第一场比赛获胜!

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这并不理想,但我想这可能是万恶之源。
      • 澄清一下,我们使用 sudo 运行了很多命令,并且在我们的环境中,这不会导致模拟用户的 .profile 被读入。我不确定这是否就是 sudo工作正常,或者如果我们没有正确设置某些东西。
      猜你喜欢
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 2015-04-22
      • 1970-01-01
      • 2014-04-11
      • 2011-09-30
      相关资源
      最近更新 更多