如何在脚本中执行.profile?切换用户后脚本参数解析异常求助
问题分析与修复方案
这个问题我之前也碰到过!核心原因是变量解析时机不对——你用双引号包裹su -c的命令字符串时,$LOG_DOR、$job这些变量会被当前执行脚本的用户shell提前展开,而不是等切换到user1后,由他的shell加载.profile再解析变量。这就导致后续命令里的参数要么是空值,要么是当前用户的变量值,自然没法正确执行。
修复方案1:用单引号包裹命令(适合变量在.profile中定义的场景)
如果$LOG_DOR和$job是user1的.profile里定义的变量,直接把外层双引号换成单引号,阻止当前shell解析变量,让命令完整传递给user1的shell:
if [ "$owner" = "user1" ] then # 单引号阻止当前shell展开变量,命令会在user1的shell中执行 su -c '. ~/.profile; cd $LOG_DOR; cat $job.log' - user1 else echo "$owner not found" fi
额外提醒:
- 注意
$LOG_DOR看起来像是拼写错误,应该是$LOG_DIR吧?如果是笔误记得修正,不然路径会找不到。 - 原脚本里的
if [ $owner = "user1" ]建议改成if [ "$owner" = "user1" ],避免$owner为空时出现语法错误。
修复方案2:混合引号(适合部分变量来自当前脚本的场景)
如果$job是当前脚本里的变量,需要传递给user1的shell,而$LOG_DOR是.profile里的变量,可以拆分引号,让需要当前shell解析的变量保持双引号,需要user1解析的变量用单引号包裹:
if [ "$owner" = "user1" ] then # 拆分引号:$job由当前shell展开,$LOG_DOR由user1的shell展开 su -c '. ~/.profile; cd $LOG_DOR; cat '"$job"'.log' - user1 else echo "$owner not found" fi
这样$job会被当前脚本的shell替换成实际值,而$LOG_DOR会在user1加载.profile后被正确解析。
内容的提问来源于stack exchange,提问作者Krishna
相关产品推荐
相关产品推荐

