我有以下问题:在脚本中,不能以root身份执行,我必须在新创建的空文件中写一行。这个文件在/ etc中,所以我需要提升的特权来写入它。
创建文件很简单:
sudo touch /etc/myfile
现在,只是使用echo来写这样的文件是行不通的......
sudo echo "something" > /etc/myfile
...因为只有命令的第一部分(echo)是用sudo执行的,而不是重定向到文件中。
以前我用过这样的东西......
sudo sed -i -e "\$aInsert this" /etc/differntfile
...添加到文件的末尾,这有效,因为该文件不为空。但是由于sed基于行工作,它没有做任何事情,文件保持完全为空。
有什么建议吗?有没有办法用回声以某种方式做到这一点?有什么特别的sed表达吗?我可以使用的其他工具吗?
答案 0 :(得分:5)
您可以使用tee
:
echo "something" | sudo tee /etc/myfile # tee -a to append
如果您不想看到输出,请重定向到/dev/null
:
echo "something" | sudo tee /etc/myfile > /dev/null
另一种选择是使用sh -c
在sudo下执行完整命令:
sudo sh -c 'echo "something" > /etc/myfile'
关于使用sed
执行此操作:我认为不可能。由于sed
是一个流编辑器,如果没有流,则无法用它做任何事情。
答案 1 :(得分:4)
如果您愿意从sed
(我也认为不能这样做)升级到awk
(准确地说是GNU awk 4.1.0或更高版本),可以这样做:
sudo gawk -i inplace '{ print } ENDFILE { print "something" }' /etc/myfile
接受的答案给出的替代方法可能更容易;我只需要一个类似的用例,就可以使用一个简单的shell命令(因此无需重定向),并且该文件必须作为单个独立参数传递(因此,没有sh -c
该目标文件嵌入其单个参数中)。与sed
不同,awk
还可处理不完整的最后一行(缺少尾随的换行符)而无需添加这样的行。
这使用了 inplace awk源库;有关详细信息,请参见man 3am inplace
。