如何给su当前用户的环境变量

问题描述 投票:0回答:6

我有一个通过

.bashrc
设置的变量。

~/.bashrc

PROJ_HOME=~/Projects/stable

从 bash shell,我想做这样的事情:

$ su -l kenneth -c 'echo $PROJ_HOME'

但是,当我这样做时,预期的

/home/kenneth/Projects/stable
没有打印出来。

关于如何做到这一点有什么想法吗?

linux bash ubuntu environment-variables
6个回答
21
投票

您尝试过 su -m 选项吗?

-m, --preserve-environment
              do not reset environment variables

例如:su -m kenneth -c 'echo $PROJ_HOME'


9
投票

您需要导出变量。您可能不需要使用

-m
选项来保护环境。

su



7
投票
export PROJ_HOME=~/Projects/stable

。 -m 应该保护环境。


编辑 再读一遍你的问题,我想我可能会反过来理解。 你也可以尝试这个:

su -m -l kenneth -c 'echo $PROJ_HOME'

    


0
投票

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
等)。
    

我也解决了这个问题,并通过将环境变量导出到配置文件中来解决。以下是我的示例代码:

-1
投票
getent

在命令周围使用单引号:

-3
投票
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'

 的值将被回显。
	

© www.soinside.com 2019 - 2024. All rights reserved.