在bash中生成脚本并将其保存到需要sudo的位置

在bash中生成脚本并将其保存到需要sudo的位置,bash,sudo,heredoc,Bash,Sudo,Heredoc,在bash中,我可以创建一个脚本,其中包含一个如下所示的here doc: ( cat只将sudo放在cat之前不起作用,因为$OUTFILE试图在当前shell进程中打开$OUTFILE,而当前shell进程不是以root身份运行。您需要在sudo-ed子进程中打开该文件 有一种方法可以实现这一点: sudo bash -c "cat >$OUTFILE" <<'EOF' #!/bin/bash #? [ ] / \ = + < > : ; " , * | #

在bash中,我可以创建一个脚本,其中包含一个如下所示的here doc:

(

cat只将
sudo
放在
cat
之前不起作用,因为
$OUTFILE
试图在当前shell进程中打开
$OUTFILE
,而当前shell进程不是以root身份运行。您需要在
sudo
-ed子进程中打开该文件

有一种方法可以实现这一点:

sudo bash -c "cat >$OUTFILE" <<'EOF'
#!/bin/bash
#? [ ] / \ = + < > : ; " , * | 
#/ ? < > \ : * | ”
#Filename="z:"${$winFn//\//\\}
echo "This is a generated shell script."
App='eval wine "C:\Program Files\foxit\Foxit Reader.exe" "'$winFn'"'
$App
EOF

sudobash-c“cat>$OUTFILE”我会这样做:

sudo tee "$OUTFILE" > /dev/null <<'EOF'
foo
bar
EOF

sudotee“$OUTFILE”>/dev/null非扩展环境变量。我的解决方法是一个tmp文件和一个sudomv

l_log=/var/log/server/server.log
l_logrotateconf=/etc/logrotate.d/server
tmp=/tmp/$$.eof
猫$tmp
$l_log{
轮换12次
月刊
压缩
米森戈克
notifempty
}
EOF
sudo mv$tmp$LOGROTATECOF

我想一个解决方案是将文件生成到一个临时位置,然后使用sudo将其移动到正确的位置。这是最优雅的方式吗?这适用于我的最小工作示例,但不适用于我的实际脚本。我已经将最小工作示例变得足够复杂,你能帮助我使用新脚本吗?@DW:我没有引用你的here单词,这可能是你的问题的根源。很抱歉。请尝试重新引用它,如我更新的答案中所示。@d W:你尝试过更新的答案吗?它适用于你问题中的较新代码。我只是再次去更新它,以实际包含你问题中的代码。有趣的是,这些引号差别太大了。太好了,谢谢。@D W:是的,我自己也对此感到惊讶。From:“若word不带引号,则此处文档的所有行都会进行参数扩展、命令替换和算术扩展。”可能有用,但这是一个多么糟糕的语法!我长期以来的理论是,大多数bash语法都是围绕以前版本中的语法错误设计的(sh是祖先根)。如何使用此方法附加到现有文件?@MountainX:
tee-a
附加到文件中。但这不会扩展env变量?
sudo tee "$OUTFILE" > /dev/null <<'EOF'
foo
bar
EOF