gpt4 book ai didi

linux - 如何以 sudo 运行多行 bash 命令

转载 作者:太空狗 更新时间:2023-10-29 12:01:36 28 4
gpt4 key购买 nike

我正在尝试启动一个需要许多开关才能运行的应用程序,因此我使用 \ 运算符对它们进行了多行排列。现在我需要运行这个应用程序以及一些要以另一个用户身份运行的导出。

我目前正在尝试做的是

sudo -u user bash <<EOF
export AUDIO_DRV=alsa
export ...
exec application --switch1 \
--switch2 \
--switch3 \
--switch4 \
... \
"$@"
EOF

我会运行 sudo myscript.sh 以便 root 可以在放弃运行主应用程序的特权之前设置一些东西。问题是多行开关并未全部传递给应用程序,从而导致意外结果。

有没有什么方法可以使这项工作像以前那样干净,或者我是否坚持将所有开关附加到一行以使其工作?

最佳答案

独立的示例是了解问题所在和原因的好方法。

这是一个独立的示例,它证明您可以使用多行参数:

touch myfile.txt
bash << eof
find . \
-name '*.txt' \
-type f
eof

这是另一个独立的示例,它表明您对 "$@" 的使用是错误的:

touch foo bar
set -- foo bar
bash << eof
ls "$@"
eof

预期结果是 bar foo(因为 ls 列出了两个文件),但实际结果是 ls: cannot access foo bar: No such file or directory(因为 ls 尝试列出一个)。

这是因为 $@ 在被传递给 bash 之前被扩展了,所以你得到的不是 "$@" 的神奇引用行为,而是 $ @ 替换为文字双引号之间变量的串联。

您应该改为将参数传递给 bash 并让 bash 扩展它们:

touch foo bar
set -- foo bar
bash -s -- "$@" << eof
ls "\$@"
eof

关于linux - 如何以 sudo 运行多行 bash 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33683580/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com