我有一个通过
.bashrc
设置的变量。
在
~/.bashrc
:
PROJ_HOME=~/Projects/stable
从 bash shell,我想做这样的事情:
$ su -l kenneth -c 'echo $PROJ_HOME'
但是,当我这样做时,预期的
/home/kenneth/Projects/stable
没有打印出来。
关于如何做到这一点有什么想法吗?
您尝试过 su -m 选项吗?
-m, --preserve-environment
do not reset environment variables
例如:su -m kenneth -c 'echo $PROJ_HOME'
您需要导出变量。您可能不需要使用
-m
选项来保护环境。su
export PROJ_HOME=~/Projects/stable
。 -m 应该保护环境。
编辑 再读一遍你的问题,我想我可能会反过来理解。 你也可以尝试这个:
su -m -l kenneth -c 'echo $PROJ_HOME'
。
su -l kenneth -c '. /home/kenneth/.bashrc; echo $PROJ_HOME'
使用路径的expanded
值在当前 shell 中创建变量。换句话说,如果您以用户 PROJ_HOME=~/Projects/stable
身份登录,变量将包含类似 luser
的内容。
如果意图是让
/home/luser/Projects/stable
获取值 su
,您需要以该用户的身份计算此表达式,或者在运行
/home/kenneth/Projects/stable
之前重写它以包含
kenneth
的预期值。
在第一个实例中,如果作业位于文件中
sudo
,您可以简单地
/etc/project.rc
在第二种情况下,也许可以尝试类似的方法su -l kenneth -c '. /etc/project.rc; echo "$PROJECT_HOME"`
当然,这会硬编码 Kenneth 的值(并且您的 shell 实际上可能没有能力将
PROJECT_HOME=~kenneth/Projects/stable su -m -l kenneth -c 'echo "$PROJECT_HOME"'
扩展到 ~kenneth
的主目录,在这种情况下可能会使用
kenneth
等)。我也解决了这个问题,并通过将环境变量导出到配置文件中来解决。以下是我的示例代码:
getent
在命令周围使用单引号:
echo export runner_token=$(echo $resp_json | jq -r '.token') >> /etc/profile
su -p - ubuntu -c '$HOME/actions-runner/config.sh --url https://github.com/${gh_repo_user}/${gh_repo_name} --token "$runner_token" --name MAC-AWS-RUNNER --labels ${gh_runner_labels}'
双引号将
$ su -l kenneth -c 'echo $PROJ_PATH'
的值解释为 root(空字符串)所见,然后以用户 kenneth 的身份执行命令 $PROJ_PATH
。
单引号将传递
"echo (empty string)"
作为命令,并且 kenneth 环境中 'echo $PROJ_PATH'
的值将被回显。