19

我有一个通过.bashrc.

~/.bashrc

PROJ_HOME=~/Projects/stable

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

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

但是,当我这样做时,/home/kenneth/Projects/stable不会打印出预期的内容。

关于如何做到这一点的任何想法?

4

6 回答 6

18

您是否尝试过选项 su -m ?

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

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

于 2012-05-07T20:42:50.567 回答
9

您需要导出变量。您可能不需要使用该-m选项su来保护环境。

export PROJ_HOME=~/Projects/stable
于 2012-05-07T21:26:45.567 回答
7

尝试使用su -m -l kenneth -c 'echo $PROJ_HOME'. -m 应该保护环境。

编辑再读一次你的问题,我想我可能理解它颠倒了。你也可以试试这个:su -l kenneth -c '. /home/kenneth/.bashrc; echo $PROJ_HOME'

于 2012-05-07T20:40:05.933 回答
0

您需要了解这里的多个步骤。

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

于 2021-12-13T08:24:54.847 回答
-1

我还解决了这个问题,并通过将 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}'
于 2021-12-13T06:57:05.140 回答
-3

在命令周围使用单引号:

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

双引号解释$PROJ_PATHroot 看到的值(空字符串),然后以"echo (empty string)"用户 kenneth 执行命令。

单引号将'echo $PROJ_PATH'作为命令传递,并且$PROJ_PATH在 kenneth 的环境中的值将被回显。

于 2013-02-09T21:37:34.203 回答