Answers:
<,>和>>用于命令的输入/输出重定向-这是shell提供的功能(例如bash)。因此,如果您键入类似的命令,sudo cat > /var/www/info.php
那么将其作为输入接收的外壳程序将尝试打开该文件,/var/www/info.php
并将该文件作为sudo
命令的标准输出提供。该sudo
命令甚至不知道其输出是要发送到控制台还是重定向到文件,因为调用它的外壳会处理该命令。
如果您在其中键入命令的外壳是您的登录外壳或另一个在终端中运行且具有您的用户ID的外壳,则它具有与您的用户ID相同的特权-而不是root用户。
因此,在您的情况下,虽然cat命令是作为root用户执行的,但它的输出要复制到/var/www/info.php
以普通用户身份运行的shell尝试,这会失败。
这种情况的解决方法是使用以下tee
命令:
sudo tee /var/www/info.php
这样可以达到预期的效果,即将在控制台输入的所有文本最多^ D放入指定为参数的文件中。
一个可能令人不快的副作用是,tee
它还会将输出回显到stdout,因此,在键入每一行并按Enter键之后tee
,它的副本会返回。为了避免这种情况,您可以使用以下变体。
sudo tee /var/www/info.php > /dev/null
有关详细信息,tee
可以info tee
在终端上通过获得。
问题是在运行sudo命令之前很久,命令解释器(shell)就解释并执行了“> foo.txt”部分。sudo命令不知道您要将其输出重定向到文件。
您的命令解释器没有超级用户权限(但最终将使用sudo命令),因此它无法将输出重定向到foo.txt。