You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在脚本中执行.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:35:37