您好可以在UNIX中从此处执行DOC循环。我试过自己,但它没有工作有没有办法呢?
#!/bin/bash
path=/global/u70/glob
echo abcd | sudo -S -l
sudo /usr/bin/su - glob << EOF
for entry in $(ls -r)
do
echo "$entry"
done
EOF
也尝试过功能 - :
#!/bin/bash
path=/global/u70/glob
echo abcd | sudo -S -l
sudo /usr/bin/su - glob << EOF
run(){
for entry in $(ls -r)
do
echo "$entry"
done
}
run
EOF
答案 0 :(得分:1)
您需要使用单引号 here document:
sudo /usr/bin/su - glob << 'EOF'
[…]
EOF
否则,$(…)
等shell替换将在当前上下文中执行,而不是作为其他用户执行。这类似于单个quoted字符串中的变量和其他shell替换未扩展的方式。
答案 1 :(得分:0)
我认为您需要在$(ls -r)前添加反斜杠才能使代码生效。即。
sudo /usr/bin/su - glob << EOF
for entry in \$(ls -r)
do
echo "$entry"
done
EOF
这是因为当你在这里的文档中(在两个EOF之间)时,所有变量都是本地的,你必须使用这些与shell变量分开的局部变量。但令人困惑的部分是,如果你只是将$变量放在heredoc中,它就不会引用heredoc中定义的$变量,而是引用shell中定义的$ variable。要访问heredoc自己的局部变量,您必须转义$,即\ $变量。
我不确定'EOF'是否有效,因为'EOF'和EOF之间的所有内容都被解释为实际字符。