曾几何时,我使用sed
和tee
组合来更改特权文件。因为shell本身没有root权限,所以我必须创造性地将命令输出写入文件:
sed -r 'script' "/etc/hosts" | sudo tee "/etc/hosts" 1>/dev/null
当时,这非常有效。只有在我开始使用我的主机文件进行广告拦截之后,才意识到管道仅限于缓冲区,之后三通很乐意覆盖该文件,文件的其余部分将消失。
我还考虑了一个更简单的版本:
sed -r 'script' "/etc/hosts" > "/etc/hosts.tmp" && sudo mv "/etc/hosts.tmp" "/etc/hosts"
不幸的是,由于有问题的文件是符号链接,因此也无法使用。 mv
将覆盖符号链接,而不是下面的文件。
我目前的解决方案是:
sed -r 'script' "/etc/hosts" | sudo tee "/etc/hosts.tmp" 1>/dev/null &&
sudo cat "/etc/hosts.tmp" | sudo tee "/etc/hosts" 1>/dev/null &&
sudo rm "/etc/hosts.tmp"
的E w!多么冗长!
有更清洁的方法吗?
答案 0 :(得分:3)
如果您正在使用GNU sed,则可以使用其-i
就地版本标志,以便将其执行结果直接保存到它处理的文件中。然后你只需要sudo
sed
命令,你应该没问题。
另外要编写文件而不是链接,请使用sed的--follow-symlinks
标记。
在其他情况下,请检查this answer to a similar question on SO。