Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何像sudo一样运行多行bash命令_Linux_Bash - Fatal编程技术网

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