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

如何将变量传递给通过sh -c选项创建的sudo子shell进程?

解决变量传递到sudo sh -c子shell的问题

你的问题出在单引号会阻止当前shell解析变量,$AUTOSTART_FILE被当作字面量传给了子shell,而子shell里并没有定义这个变量,所以无法正确写入目标文件。以下是几种可靠的解决方式:

方式一:用双引号替换单引号,让当前shell先展开变量

把命令外层的单引号改成双引号,这样当前shell会先解析$AUTOSTART_FILE,再把完整的命令传给子shell:

sudo sh -c "printf '@lxpanel --profile LXDE-pi\n@/home/pi/exec.sc' > $AUTOSTART_FILE"

注意:如果变量值包含空格或特殊字符,这种方式可能引发问题,适合路径无特殊字符的场景。

方式二:导出变量并保留环境

先把变量导出为环境变量,再用sudo -E保留当前环境,让子shell能读取到变量:

AUTOSTART_FILE=/etc/xdg/lxsession/LXDE-pi/autostart
export AUTOSTART_FILE
sudo -E sh -c 'printf "@lxpanel --profile LXDE-pi\n@/home/pi/exec.sc" > $AUTOSTART_FILE'

-E选项的作用是让sudo保留用户原有的环境变量,确保子shell能拿到AUTOSTART_FILE的值。

方式三:将变量作为命令参数传递(最安全)

把变量作为sh -c的参数传入,在命令字符串里用$1引用这个参数,这种方式完全避免了变量解析的冲突,适合所有场景:

AUTOSTART_FILE=/etc/xdg/lxsession/LXDE-pi/autostart
sudo sh -c 'printf "@lxpanel --profile LXDE-pi\n@/home/pi/exec.sc" > $1' -- "$AUTOSTART_FILE"

这里的--用来明确分隔sudo的选项和后续的命令参数,确保变量被正确传递。

内容的提问来源于stack exchange,提问作者BHP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 18:10:36