Linux 如何像sudo一样运行多行bash命令
我正在尝试启动一个需要许多开关才能运行的应用程序,因此我使用Linux 如何像sudo一样运行多行bash命令,linux,bash,Linux,Bash,我正在尝试启动一个需要许多开关才能运行的应用程序,因此我使用\操作符对它们进行了多行操作。现在,我需要运行这个应用程序以及一些要作为另一个用户运行的导出 我目前正在尝试做的是 sudo -u user bash <<EOF export AUDIO_DRV=alsa export ... exec application --switch1 \ --switch2 \ --switch3 \ --switch4 \ ... \ "$@" EOF
\
操作符对它们进行了多行操作。现在,我需要运行这个应用程序以及一些要作为另一个用户运行的导出
我目前正在尝试做的是
sudo -u user bash <<EOF
export AUDIO_DRV=alsa
export ...
exec application --switch1 \
--switch2 \
--switch3 \
--switch4 \
... \
"$@"
EOF
sudo-u用户bash我认为以下是答案:
一般而言:
sudo-s-‘whoami;哇
sudo -u user -s -- ' \
whoami; \
whoami; \
"$@"
'
自足的例子是一个很好的方法,可以看出哪里出了问题,为什么出了问题
下面是一个自包含的示例,演示了使用多行参数是可以的:
touch myfile.txt
bash << eof
find . \
-name '*.txt' \
-type f
eof
预期结果是bar foo
(因为ls列出了两个文件),但实际结果是ls:无法访问foo bar:没有这样的文件或目录
(因为ls尝试列出一个)
这是因为$@
在传递给bash之前是展开的,因此,您只需要将$@
替换为文本双引号之间的变量串联,而不是“$@
的神奇引用行为
您应该将参数传递给bash,并让bash展开它们:
touch foo bar
set -- foo bar
bash -s -- "$@" << eof
ls "\$@"
eof
触摸食物栏
set--foo-bar
bash-s--“$@”您可以将命令写入文件中,并使用sudo将其作为脚本执行。脚本不需要包含多行转义“\”——如果需要,可以在一行中编写整个命令
此外,您还可以构建一个函数并使用sudo执行该函数
MyFuncion(){
application --switch1 --switch2 --switch3 --switch4 "$@"
cmd 2
# etc
}
sudo MyFunction
因此,您是说,无法为sudo的单个应用程序清晰地显示多个开关?您不需要引号中的反斜杠。@chepner是对的,不需要黑色斜杠,需要在每条命令后加分号“$@”正是问题所在。谢谢我认为这是多行参数的唯一原因是因为应用程序正在打印消息,说明没有接收到需要操作的开关之一,或者我是这么认为的。谢谢@randynewfield我错过了告诉bash不要将它们解释为自己的选项的--
MyFuncion(){
application --switch1 --switch2 --switch3 --switch4 "$@"
cmd 2
# etc
}
sudo MyFunction