我有一个通过.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
尝试使用su -m -l kenneth -c 'echo $PROJ_HOME'
. -m 应该保护环境。
编辑再读一次你的问题,我想我可能理解它颠倒了。你也可以试试这个:su -l kenneth -c '. /home/kenneth/.bashrc; echo $PROJ_HOME'
。
您需要了解这里的多个步骤。
PROJ_HOME=~/Projects/stable
在当前 shell中使用路径的扩展值创建一个变量。换句话说,如果您以 user 身份登录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"`
在第二种情况下,也许尝试类似
PROJECT_HOME=~kenneth/Projects/stable su -m -l kenneth -c 'echo "$PROJECT_HOME"'
当然,这对 Kenneth 的值进行了没有吸引力的硬编码(并且您的 shell 实际上可能没有扩展~kenneth
到 的主目录的功能kenneth
,在这种情况下可能会使用getent
等)。
我还解决了这个问题,并通过将 env 变量导出到配置文件中进行了修复。下面是我的示例代码:
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'
双引号解释$PROJ_PATH
root 看到的值(空字符串),然后以"echo (empty string)"
用户 kenneth 执行命令。
单引号将'echo $PROJ_PATH'
作为命令传递,并且$PROJ_PATH
在 kenneth 的环境中的值将被回显。