将 sed 的输出重定向到文件时,sudo 不起作用[重复]

Posted

技术标签:

【中文标题】将 sed 的输出重定向到文件时,sudo 不起作用[重复]【英文标题】:sudo doesn't work when redirecting the output of sed to a file [duplicate] 【发布时间】:2012-10-19 22:58:52 【问题描述】:

可能重复:How do I use sudo to redirect output to a location I don’t have permission to write to?

假设我想更改 /home 中的文件“foo”,对其应用一些正则表达式(通过 sed),并将结果放入名为 /home/foo2 的文件中.

我对 /home 或 foo 都没有读/写权限,所以我使用 sudo。但是,我仍然得到一个权限被拒绝

sudo sed "s/bar/baz/" <foo >foo2
bash: foo2: Permission denied

有什么想法吗? 谢谢

【问题讨论】:

您遇到了问题,因为 shell 在启动 sudo 之前进行了 I/O 重定向,因此它使用您自己的权限进行重定向,您知道这还不够。因此,要让它工作,你必须让sudo 运行的程序来做I/O 重定向。我看到的两个答案都达到了这个结果。 【参考方案1】:

使用就地选项-i。你的语法是:

sed -i [pattern] filename

【讨论】:

-i 用于读取文件,我获得了写入权限被拒绝 哦哦!原来 -i 用于在同一个文件中读写,太棒了,谢谢 (但我必须先做 sudo cp foo foo2) 我应该提到我怀疑您在同时读取和写入同一文件时遇到了问题,并且您的问题与此有关,而不是文件权限问题。 好吧,事情是,在我写的命令中我有一个错字:我写了 ">foo foo2 【参考方案2】:

虽然sh 通常可能不是一个好主意,但这将允许为您的 shell 创建一个新文件 foo2

sudo sh -c "sudo sed 's/bar/baz/' &lt;foo &gt;foo2"

【讨论】:

以上是关于将 sed 的输出重定向到文件时,sudo 不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

sudo 与输出重定向

使用系统命令将stdout和stderr输出重定向到文件在perl中不起作用[重复]

将输出重定向为不同的用户[重复]

如何通过 sudo 使用输出重定向? [复制]

取编译参数时遇到的管道重定向问题

如何将 systemd 服务的输出重定向到文件