为何runuser中echo已存在的环境变量无输出?如何解决?
runuser内联变量传递的问题分析与解决
为什么echo $TEST没有输出?
核心问题是变量解析的时机不同:
- 执行
TEST="hello" runuser -u user1 -- echo $TEST时,$TEST是被当前你正在使用的shell解析的,而非runuser切换到user1后启动的shell。 - 你只是把
TEST="hello"作为runuser进程的环境变量前缀,并未在当前shell中定义TEST变量,所以当前shell会把$TEST解析为空字符串,实际传给runuser的命令变成了echo(空命令),自然没有输出。 - 而
printenv TEST能正常工作,是因为printenv直接从进程的环境变量列表中读取值,不需要经过shell的变量展开步骤,它能直接拿到传递给runuser的TEST环境变量。
解决方法(不影响当前shell环境)
要让TEST变量在user1的shell中被解析,而非当前shell,有两种简单方式:
方式一:用单引号包裹命令,阻止当前shell解析变量
TEST="hello" runuser -u user1 -- 'echo $TEST'
单引号会让当前shell不对$TEST做任何展开,直接把echo $TEST完整传递给user1的shell,此时user1的shell会从自己的环境中读取TEST的值并展开,就能输出hello了。
方式二:使用runuser的-c参数显式启动shell执行命令
TEST="hello" runuser -u user1 -c 'echo $TEST'
通过-c参数直接指定要执行的shell命令,同样用单引号避免当前shell解析$TEST,user1的shell执行命令时会读取环境中的TEST变量并输出。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

