无法重定向标准输出

无法重定向标准输出

我正在遵循第 6 章中的示例重定向Linux 命令行(2012)。我尝试将ls命令的标准输出重定向到文本文件。我一直收到权限被拒绝的错误。我使用的是 Ubuntu 13.04。见下文:

ta2tyrants@Vaio:/$ ls -l /usr/bin >> ls-output.txt
bash: ls-output.txt: Permission denied

我尝试使用 root 访问权限运行此命令并出现相同的错误:

ta2tyrants@Vaio:/$ sudo ls -l /usr/bin >> ls-output.txt
bash: ls-output.txt: Permission denied

我做错了什么? 有办法解决这个问题吗?

答案1

解决方案 1:重定向到可以写入的文件

您当前的工作目录是/,默认情况下只能由 root 修改。输入cd ~以更改为您的主文件夹,或cd后跟您要更改的目录的路径写完后再重复一遍。

解决方案 2:重定向shsudo

Shell 重定向不会传递给程序。这意味着即使在 下执行程序sudo,重定向(如>>)仍将在您的帐户下执行。以下是发生的情况:

  sudo         ls -l /usr/bin         >>/ls-output.txt
-------------------------------------------------------
|     execute external program      | redirect stdout |       what your shell sees
| sudo | command to execute as root |                            what sudo sees

如果您想要sudo重定向,则需要以 root 身份运行 shell。您可以这样做:

     sudo         sh   -c '      ls -l /usr/bin           >>/ls-output.txt   '
-------------------------------------------------------------------------------
|      execute external program (pass the single-quoted string verbatim)      | your shell
|    sudo       |                command to execute as root                   |    sudo
                | sh | -c | execute external program |    redirect stdout     | root shell

这样,重定向就是sh在 下完成的调用的一部分sudo

解决方案 3:重定向teesudo

作为♦莱茵 建议,你也可以将命令通过管道传入 tee:

       ls -l /usr/bin          |     sudo        tee /ls-output.txt
-------------------------------------------------------------------------
| execute external program | pipe |      execute external program       | your shell
                                  |  sudo  | command to execute as root |    sudo

请注意,tee在 下执行sudo,但不在 下执行ls。这是因为tee需要 root 权限(写入/ls-output.txt),而ls不需要。如果程序生成输出做过需要 root 权限,所以你需要这sudo两者。

   sudo        ls -l /root              |    sudo        tee /ls-output.txt
--------------------------------------------------------------------------------
|     execute external program      | pipe |     execute external program      | your shell
| sudo | command to execute as root |                                             sudo #1
                                           | sudo | command to execute as root |  sudo #2

另外,如果您不想在屏幕上显示输出,您可以将其添加>/dev/null到行的最末尾。

相关内容