【问题标题】:Import PATH environment variable into Bash script launched with cron将 PATH 环境变量导入使用 cron 启动的 Bash 脚本
【发布时间】:2016-11-27 00:59:16
【问题描述】:

在创建 Bash 脚本时,我总是在开头有一行定义 PATH 环境变量。我最近发现这不会使脚本非常便携,因为 PATH 变量对于不同版本的 Linux 是不同的(在我的例子中,我将脚本从 Arch Linux 移动到 Ubuntu 并收到错误,因为各种可执行文件不在相同的地方)。

是否可以将登录shell定义的PATH环境变量复制到当前的Bash脚本中?


编辑: 我看到我的问题引起了一些混乱,导致一些人认为我想用 bash 脚本更改登录 shell 的 PATH 环境变量,这与我想要的完全相反。

这是我目前在我的一个 Bash 脚本顶部的内容:

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
# Test if an internet connection is present
wget -O /dev/null google.com

我想将第二行替换为 复制 PATH 的值 登录 shell 进入 脚本环境:

#!/bin/bash
PATH=$(command that copies value of PATH from login shell)
# Test if an internet connection is present
wget -O /dev/null google.com

编辑 2:对于我的重大遗漏,我深表歉意。我忘了提到有问题的脚本是通过 cron 按计划运行的。 Cron 创建它自己的环境来运行不使用登录 shell 的环境变量或修改它们的脚本。我刚刚尝试在 cron 中运行以下脚本:

#!/bin/bash
echo $PATH >> /home/user/output.txt

结果如下。可以看到,cron使用的PATH变量与登录shell不同:

user@ubuntu_router:~$ cat output.txt
/usr/bin:/bin
user@ubuntu_router:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

【问题讨论】:

  • 你为什么要这样做?
  • 在 Mac OS X 上,/etc/profile 包含:if [ -x /usr/libexec/path_helper ]; then eval /usr/libexec/path_helper -s; fi。这将设置 PATHMANPATH。您可以在 U&L 和 SU 上找到有关 path_helper 的问题 — 提到的速度问题已经解决(在 10.11.6 上是几个 - 如 8-10 - 毫秒)。在 Linux 上查看 /etc/paths.d?但问题是——你为什么要修补 PATH?对于应该使用哪些版本的命令,我可能有自己的看法;这就是我的 PATH 设置的用途。当然,如果我破坏了你的脚本,我有责任修复它。
  • 恐怕你们两个误解了我的要求。我已经编辑了我的问题,希望能把事情弄清楚。
  • 不,你不明白这些 cmet 告诉你什么。您要求的是您的程序的不良行为,并且似乎基于错误的假设。
  • 所有进程从其父进程继承PATH 的值。你不必做任何特别的事情。如果您需要证明,请将echo $PATH 作为脚本的第一行。

标签: linux bash path cron


【解决方案1】:

除非您有特定原因,否则请不要触碰用户的PATH。什么都不做(基本上)会完成你的要求。

您无需执行任何操作即可获得用户的正常PATH,因为每个进程都会自动继承PATH 和所有其他环境变量。

如果您需要向PATH 添加一些非标准的内容,通常的方法是将新目录预先(或附加)到用户现有的PATH,如下所示:

PATH=/opt/your/random/dir:$PATH

cron 作业的环境非常接近系统的“默认”(对于“默认”的某些定义),尽管交互式 shell 通常可以在受限较少的环境中运行。但同样,解决方法是在脚本开头将任何缺少的目录添加到当前值。添加此特定系统上不存在的目录是无害的,引入重复目录也是如此。

【讨论】:

  • 你误解了我的问题。我不想修改PATH 环境变量。我想将该环境变量的值复制到脚本的环境中。
  • 我相信我完全理解你;如果您什么都不做,您将继承用户的PATH,在大多数情况下,它与系统默认的PATH 相同,如果不是,则用户很可能有充分的理由这样配置它.无论如何,没有必要有一个单一的系统范围的默认值,尽管这是常见的做法,例如在 Linux 上。如果您确实需要覆盖用户配置的首选项,那么我描述的机制就是您可能应该做的,而不是您看起来想要的。
  • 我再次编辑了我的问题。我刚刚意识到有一条非常重要的信息我忘了提及。非常抱歉。
  • 我基本上仍然坚持这个答案,尽管我用一些cron 评论对其进行了简短的更新。
【解决方案2】:

我已经找到了问题的答案:

PATH=$PATH:$(sed -n '/PATH=/s/^.*=// ; s/\"//gp' '/etc/environment')

此命令将从environment 文件中获取Linux 分配给PATH 的值,并将其附加到Cron 使用的PATH

我使用以下资源来帮助找到答案:

How to grep for contents after pattern?

https://help.ubuntu.com/community/EnvironmentVariables#System-wide_environment_variables

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 2011-10-17
    • 2021-10-03
    • 2017-10-26
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    相关资源
    最近更新 更多