首页 > 解决方案 > 执行与另一个进程具有相同环境变量的进程

问题描述

我想制作一个脚本,允许我执行从任何 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.

我应该如何满足我的需求?

提前致谢

标签: linuxshell

解决方案


那应该可以工作(在 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 ......必须阅读更多内容:))


推荐阅读