如何使用Bash向ROOT权限文件追加内容?
嘿,这俩问题都是sudo和shell行为的经典坑,我给你一步步拆解清楚:
1. 为啥sudo echo -e "foo\nbar" >> foobar会提示权限拒绝?
你踩的是shell重定向的权限陷阱:当你输入这条命令时,你的普通用户bash会先处理>> foobar这个重定向操作,然后才会执行sudo echo。也就是说,写文件的动作是你的普通用户shell在做,而不是拥有root权限的echo命令——普通用户当然没权限往root所有的foobar里写,所以就报错了。
解决办法:
- 方法一:让root shell处理重定向
直接让sudo启动一个root权限的shell来执行整个命令(包括重定向),注意用bash而不是sh(后面会说原因):sudo bash -c 'echo -e "foo\nbar" >> foobar' - 方法二:用
tee命令(更推荐)tee命令可以读取标准输入并写入文件,用sudo给tee提升权限,就能绕过shell重定向的权限问题:
这里的echo -e "foo\nbar" | sudo tee -a foobar-a是追加模式,如果不加会覆盖文件内容,记得别漏! - 方法三:bash进程替换(进阶玩法)
如果你习惯用bash,也可以用进程替换让tee直接读取echo的输出:sudo tee -a foobar < <(echo -e "foo\nbar")
2. 为啥sudo sh -c 'echo -e "foo\nbar" >> toto'会输出-e foo?
这是因为不同shell的echo行为不一样:
- 你的默认shell(比如bash)里的
echo是GNU扩展版本,支持-e选项来解析换行符这类转义字符; - 但
sh通常是POSIX标准的shell(比如dash),它的echo不支持-e——POSIX标准里,echo会把所有命令行参数原封不动输出,包括-e这个选项本身。
解决办法:
- 换成bash执行
直接指定用bash来运行命令,这样就能用支持-e的echo了:sudo bash -c 'echo -e "foo\nbar" >> toto' - 用
printf代替echo(跨shell通用)printf是POSIX标准命令,所有shell的行为都一致,而且天生支持转义字符,不需要额外选项:
注意最后要加一个sudo sh -c 'printf "foo\nbar\n" >> toto'\n,因为echo默认会在输出末尾加换行,而printf需要手动指定。
内容的提问来源于stack exchange,提问作者nowox
相关产品推荐
相关产品推荐

