当我将ls的输出重定向到文件时,Bash返回权限被拒绝错误

我目前正在研究shell命令,其中一个练习包括创建一个包含各种目录和子目录的结构。

我写了ls -laR > hello ,它应该创建一个名为hello的文本文件。 但是,我得到以下消息bash: hello: permission denied ,即使我在开头键入sudo。

该命令在另一个Linux发行版中有效。 另外,我在几分钟前使用ls -la在我想要创建文件的目录中,它给了我这个:

 drwxr-xr-x 2 root root 4096 Nov 26 10:56 . drwxr-xr-x 5 root root 4096 Nov 26 10:56 .. 

根据第一个三合会我有写权限?

因为root是您要创建hello文件的目录的所有者,并且来自同一组的用户和其他用户没有在该目录中写入的权限,所以当您运行ls -laR > hello时,将获得bash: hello: permission denied错误ls -laR > hello

此外,当您使用前面的sudo运行相同的命令时,您将得到完全相同的错误。 这是因为输出重定向( >运算符)由shell完成 ,而不是由ls ,因此sudo对它没有影响。 sudo只对ls -laR 。 要防止这种情况,您必须以root用户身份登录:

 sudo -i 

然后你可以使用重定向:

 ls -laR > hello 

否则,您可以使用root权限在子shell中运行bash命令:

 sudo bash -c "ls -laR > hello" 

最后,另一个选项,而不是通过>运算符使用重定向,您可以使用tee命令:

 ls -laR | sudo tee hello 

您不必在这种情况下使用sudo for ls命令,因为来自同一组的用户和所有其他用户的用户在该目录中具有读取和执行权限。

将hello文件放在可写目录中,如下所示:

 ls -laR > /tmp/hello 

或者,如果您真的想在您不拥有的目录中创建文件,请运行:

 sudo sh -c "ls -laR > hello"