在bash中,我可以创建一个带有here-doc的脚本,如下所示,根据这个站点:http://tldp.org/LDP/abs/html/abs-guide.html#GENERATESCRIPT
(
cat <<'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
) > $OUTFILE如果我的$OUTFILE是一个需要sudo权限的目录,我应该把sudo命令放在哪里,或者我还能做些什么来使它工作?
发布于 2010-12-11 02:33:44
仅仅将sudo放在cat之前是行不通的,因为>$OUTFILE试图在当前shell进程中打开$OUTFILE,而当前shell进程不是以根用户身份运行的。您需要在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这将在sudo下启动一个子shell,并从该特权较高的子进程中打开$OUTFILE,然后运行cat (作为另一个特权子进程)。同时,(较低特权的)父进程通过管道将here-document传递给sudo子进程。
发布于 2010-12-11 09:58:49
这就是我要做的:
sudo tee "$OUTFILE" > /dev/null <<'EOF'
foo
bar
EOF发布于 2019-12-24 12:32:29
答案中没有扩展环境变量。我的解决方法是tmp文件和sudo mv。
l_log=/var/log/server/server.log
l_logrotateconf=/etc/logrotate.d/server
tmp=/tmp/$$.eof
cat << EOF > $tmp
$l_log {
rotate 12
monthly
compress
missingok
notifempty
}
EOF
sudo mv $tmp $logrotateconfhttps://stackoverflow.com/questions/4412029
复制相似问题