linux - 执行与另一个进程具有相同环境变量的进程
问题描述
我想制作一个脚本,允许我执行从任何 PID 继承环境变量的命令。这是我制作的脚本:
#!/bin/sh
VARS=$(cat -A /proc/1/environ | tr "^@" "\n")
COMMAND=""
# sh compatible loop on a variable containing multiple lines
printf %s "$VARS" | while IFS='\n' read -r var
do
if [ "$var" != "" ]; then
export "$var"
fi
done
exec "$@"
我虽然导出的变量可用于子进程(由创建exec
),但显然不是这种情况,因为sh my_script.sh printenv
不显示/proc/1/environ
.
我还尝试了以下脚本:
#!/bin/sh
VARS=$(cat -A /proc/1/environ | tr "^@" "\n")
COMMAND=""
# sh compatible loop on a variable containing multiple lines
printf %s "$VARS" | while IFS='\n' read -r var
do
if [ "$var" != "" ]; then
# Replace 'VAR=var' by 'VAR="var"' for eval
# sed replace only the first occurence of the '=' due of the missing /g parameter
escaped=$(echo $var | sed -e 's/=/="/')\"
COMMAND="${COMMAND} ${escaped}"
fi
done
COMMAND="${COMMAND} $@"
eval $COMMAND
但是,eval
即使评估的命令看起来像VAR=value my_command
.
我应该如何满足我的需求?
提前致谢
解决方案
那应该可以工作(在 RHEL 7 上测试)
#!/bin/bash
locPROC=$1
locCMD=$2
if [[ -z $locPROC || -z $locCMD ]]; then
exit
fi
if [[ -r /proc/${locPROC}/environ ]]; then
while IFS= read -r -d '' line; do
#Making sure it's properly quoted
locVar="${line/=/=\"}\""
#You probably don't want to mess with those
if [[ ${locVar:0:1} != "_" && ${locVar} != A__z* ]]; then
eval "$locVar"
eval "export ${locVar%%=*}"
fi
done < "/proc/${locPROC}/environ"
$locCMD
else
echo "Environment file is either inexistant or unreadable"
fi
编辑:根据评论(仍然使用 eval ......必须阅读更多内容:))
推荐阅读
- database - 文件夹存储的结构/方法
- c++ - boost::last_write_time 在文件修改后的每次第一次调用中返回错误的值(通过 VPN 连接的网络驱动器中的文件)
- python-3.x - pyspark:通过发送--py-file参数将文件用作模块时没有模块错误
- vuejs2 - VueJs - 在数据函数中使用模板字符串返回未定义
- playframework - 下载 play 2.7 - 找不到 zip 文件夹
- python - 将 python tkinter GUI 转换为 EXE 文件
- javascript - 在指定时间过去后有什么方法可以杀死 String.prototype.match?
- kubernetes - 为什么 Kubernetes OOM 会杀死一个暂停容器?
- python - 使用python进行图像分类时如何修复“AttributeError:'str'对象没有属性'__array_interface__'”
- javascript - 如何在 React Hooks 中使用 setTimeout 更新状态值?