Gil*_*il' 123

这不起作用,因为重定向是由 shell 执行的,而不是由它适用的命令执行的。但是您的 shell 不是以 root 身份运行,而是以 root 身份运行echo 'text'

当您需要具有 root 权限来写入文件而不是生成数据时,一个常见的技巧是使用tee

echo 'text' | sudo tee -a /file.txt
Run Code Online (Sandbox Code Playgroud)

tee也将文本打印到标准输出。为了使其静音,使其行为更类似于 shell 附加 ( >>),请将标准输出路由到/dev/null

echo 'text' | sudo tee -a /file.txt > /dev/null
Run Code Online (Sandbox Code Playgroud)

如果您确实需要 root 权限来生成数据,您可以运行两个单独的sudo命令,或者在里面运行一个 shellsudo并在那里进行重定向(小心引用)。

sudo echo 'text' | sudo tee -a /file.txt
sudo sh -c 'echo "text" >>/file.txt'
Run Code Online (Sandbox Code Playgroud)

在覆盖而不是追加时,如果您习惯于使用>运算符 ( set -o noclobber)拒绝截断现有文件的 shell ,请记住此保护将不适用。sudo sh -c 'echo >/etc/passwd'并且sudo tee /etc/passwd会覆盖/etc/passwd,您需要sudo sh -o noclobber -c 'echo >/etc/passwd'将该noclobber设置也应用于sh开始的sudo


Tho*_*mel 9

您告诉 bash 打开一个文件并将命令的输出附加sudo echo 'text'到它,这当然不起作用,因为您的 bash 以非 root 身份运行。交互式地,我通常会跑来sudo -s解决这个问题(从那时起,shell 以 root 身份运行并且可以打开文件)。或者,您可以运行sudo sh -c "echo 'text' >> /file.txt",它也可以工作,但是如果您有复杂的表达式,所有插值/转义都会造成干扰,这有点麻烦。