我有这个命令(用户是我的用户帐户的名称:echo $USER):
sudo -H -u user bash -c 'DISPLAY=:0 /usr/bin/dbus-launch /home/user/myappimage start -i &'
工作正常。现在我想创建一些变量来替换我的用户和路径 appimage:
myuser="user"
pathappimage="/home/$myuser/myappimage"
sudo -H -u $myuser bash -c 'DISPLAY=:0 /usr/bin/dbus-launch $pathappimage start -i &'
问题是$pathappimage
由于命令中的单引号导致变量无法识别它。
我该如何修复它?
答案1
也许双引号就可以了:
sudo -H -u $myuser bash -c "DISPLAY=:0 /usr/bin/dbus-launch $pathappimage start -i &"
或者如果你的$pathappimage
可以包含空格等:
… "DISPLAY=:0 /usr/bin/dbus-launch \"$pathappimage\" start -i &"
^^ ^^
# these double quotes are escaped and they will remain
如果由于某种原因您需要单引号,您可以更改引号类型,如下所示:
sudo -H -u $myuser bash -c 'DISPLAY=:0 /usr/bin/dbus-launch '"$pathappimage"' start -i &'
# ^---- this is still treated as a single argument to bash ----^
$pathappimage
bash
将在运行之前由当前 shell 扩展。如果您希望bash
看到结果为双引号,以防 中有空格或其他内容$pathappimage
,则像这样调用:
… 'DISPLAY=:0 /usr/bin/dbus-launch "'"$pathappimage"'" start -i &'
# ^ ^
# these double quotes are in single quotes and they will remain
或甚至单引号:
… 'DISPLAY=:0 /usr/bin/dbus-launch '\'"$pathappimage"\'' start -i &'
# ^^ ^^
# these single quotes are escaped and they will remain
另一种(较差的)方法。您可以使用export
变量,将整个字符串放在单引号中传递,然后根据需要取消导出:
export pathappimage
bash -c 'DISPLAY=:0 /usr/bin/dbus-launch "$pathappimage" start -i &'
# bash will see the whole single-quoted string literally
export -n pathappimage
现在bash
你调用将会扩展$pathappimage
,这个变量将在其环境中。然而 sudo
除非您使用 ,否则不会保留环境sudo --preserve-env
,这可能不是您想要的或无法做到的。因此,巧妙引用更好,也可能更安全。