通过附加到当前 tty 的 su 运行heredoc脚本

c24*_*24w 4 su tty stdin here-document

我正在尝试做这样的事情:

sudo su <<EOF
select x in a b c; do echo "Selected $x"; break; done
EOF
Run Code Online (Sandbox Code Playgroud)

但是,它会终止而不接受输入。

如果我这样做,它会起作用:

sudo su -c 'select x in a b c; do echo $x; break; done'
Run Code Online (Sandbox Code Playgroud)

但用heredoc编写更长的脚本会更好(是的,我知道将它们放在文件中更好)。

我确信这个问题在各个地方都有答案,但我似乎无法找到正确的 bash/heredoc/tty/stdin 搜索词组合。

有什么办法可以实现这一点吗?

Bar*_*mar 5

问题是select尝试从标准输入读取,该标准输入被重定向到此处文档。由于没有对提示做出响应,因此会出现错误。

解决方案是将输入重定向回此处文档中的终端。

sudo -s <<'EOF'
select x in a b c; do 
    echo "Selected $x"
    break
done </dev/tty
EOF
Run Code Online (Sandbox Code Playgroud)

另外,您需要EOF在此处的文档中添加引号以防止变量扩展。否则它会$x在原始 shell 中扩展,而不是在从 获取值的子 shell 中扩展select