如何将变量传递给通过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
相关产品推荐
相关产品推荐

