我正在尝试启动一个需要很多开关才能运行的应用程序,所以我使用\
运算符对它们进行多行排列。现在我需要运行此应用程序以及一些导出作为另一个用户运行。
我目前正在尝试做的是
sudo -u user bash <<EOF
export AUDIO_DRV=alsa
export ...
exec application --switch1 \
--switch2 \
--switch3 \
--switch4 \
... \
"$@"
EOF
我会运行sudo myscript.sh
,以便root可以在删除运行主应用程序的权限之前设置一些内容。问题是多行开关并未全部传递给应用程序,从而导致意外结果。
有没有什么方法可以让这项工作变得干净,或者我将所有开关附加到一行以使其工作?
答案 0 :(得分:2)
自包含的示例是查看错误和原因的好方法。
这是一个自包含的示例,演示了您对多行参数的使用很好:
JSON.stringify
这是另一个自包含的示例,它表明您使用touch myfile.txt
bash << eof
find . \
-name '*.txt' \
-type f
eof
是错误的:
"$@"
预期结果为touch foo bar
set -- foo bar
bash << eof
ls "$@"
eof
(因为ls列出了两个文件),但实际结果为bar foo
(因为ls会尝试列出一个)。
这是因为ls: cannot access foo bar: No such file or directory
在传递给bash之前已经展开,因此,$@
代替了"$@"
的魔术引用行为,只需将$@
替换为文字之间的变量串联双引号。
您应该将参数传递给bash并让bash展开它们:
touch foo bar
set -- foo bar
bash -s -- "$@" << eof
ls "\$@"
eof
答案 1 :(得分:0)
我认为这是答案:how to run two commands in sudo?
一般来说:
sudo -s - &#39; whoami; WHOAMI&#39;
sudo -u user -s -- ' \
whoami; \
whoami; \
"$@"
'
答案 2 :(得分:0)
您可以在文件中编写命令,并使用sudo将其作为脚本执行。该脚本不需要包含多行转义&#34; \&#34; - 如果需要,您可以在一行中编写整个命令。
此外,您可以使用sudo构建函数并执行该函数。
MyFuncion(){
application --switch1 --switch2 --switch3 --switch4 "$@"
cmd 2
# etc
}
sudo MyFunction