我正在尝试编写一个脚本来使用sed复制默认为 apache 创建文件并写入一个新文件,用我自己的目录替换/var/www
(下面) 。但是,sed 在 sudo 下无法正常运行:我得到一个$DOC_ROOT
$NEW_SITES_DIR
“没有权限”错误如下:
sudo sed -ie 's:$DOC_ROOT:$NEW_SITES_DIR:g' < default > $NEW_SITE
我尝试过生成一个子 shell
sudo sh -c "sed -ie 's:$DOC_ROOT:$NEW_SITES_DIR:g' < default > $NEW_SITE"
并使用球座
sudo sed -ie 's:$DOC_ROOT:$NEW_SITES_DIR:g' < default | sudo tee $NEW_SITE
但我得到了“没有输入文件”而是错误。
我确信我最后写的两次尝试都有点不对劲。任何建议都将不胜感激。
已回答
感谢大家的帮助。以下是确切的命令:
sudo sed -e "s:$DEF_SITES_DIR:$NEW_SITES_DIR:g" < $DEF_SITE | sudo tee $NEW_SITE
以下是来自的一个关键词此引用:
不要为此失眠,但有一天它会派上用场,当你能弄清楚为什么“sudo”在你的命令中的“>”之后不适用时,请记住 tee 并回到这里。
答案1
您的问题是-i
。这告诉sed
您就地编辑文件,但您通过重定向在 stdin 上提供文件。尝试删除-i
。
由于接受文件名作为参数,因此实际上无需重定向输入文件sed
。如果文件的读取权限受到限制,则sudo sed
(不使用重定向)将处理该问题。如果不使用,-i
原始文件将保持不变。
如果有必要的话应该sudo tee
注意输出的写权限。