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