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