将 PATH 环境变量导入到使用 cron 启动的 Bash 脚本中

XJD*_*HDR 3 linux bash cron path

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

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


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

这是我目前在我的 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
Run Code Online (Sandbox Code Playgroud)

我想将第二行替换为将登录 shell复制脚本环境中的内容:PATH

#!/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
Run Code Online (Sandbox Code Playgroud)

编辑2:很抱歉我的重大遗漏。我忘了提及,相关脚本正在通过 cron 按计划运行。Cron 创建自己的环境来运行脚本,该环境不使用登录 shell 的环境变量或修改它们。我刚刚尝试在 cron 中运行以下脚本:

#!/bin/bash
echo $PATH >> /home/user/output.txt
Run Code Online (Sandbox Code Playgroud)

结果如下。如您所见,PATHcron 使用的变量与登录 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
Run Code Online (Sandbox Code Playgroud)

tri*_*eee 5

PATH除非有特定原因,否则根本不要碰用户的。不做任何事(基本上)会完成你所要求的。

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

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

PATH=/opt/your/random/dir:$PATH
Run Code Online (Sandbox Code Playgroud)

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