返回

如何在 Bash 重定向中同时接收输入并重定向错误输出?

Linux

Bash 重定向:在重定向错误输出的同时接收标准输入

问题

在 Bash 脚本中,我们经常需要将错误输出(Stderr)重定向到一个文件中。然而,这样做会同时重定向标准输入(Stdin),导致无法从终端接收输入。

解决方案:tee 命令

为了解决这个问题,我们可以使用 tee 命令。tee 允许我们将数据管道到一个文件中,同时仍将其发送到标准输出。这样,我们可以将错误输出和标准输出都重定向到文件中,同时保持标准输入从终端接收输入。

改进的脚本:

#!/bin/bash

read -p "Enter 1 or 0: " var
echo "hello"

bash <<EOF | tee logs
    echo "testing"
    error
EOF

重定向过程:

  • bash <<EOF | tee logs:使用 bash 运行一个新的命令并将其输出管道到 tee logs
  • tee logs:将输出数据管道到 logs 文件,同时保留 Stdin 从终端接收输入。

注意点

  • 此方法适用于将 Stderr 和 Stdout 重定向到同一个文件的情况。
  • 如果需要将 Stderr 和 Stdout 分别重定向到不同的文件,可以使用以下命令:
    • command 2> error.log:将 Stderr 重定向到 error.log
    • command > output.log 2>&1:将 Stdout 和 Stderr 都重定向到 output.log

总结

通过使用 tee 命令,我们可以同时将错误输出重定向到一个文件中并保持标准输入从终端接收输入。这在编写 Bash 脚本时非常有用,可以帮助我们记录错误信息并同时与用户交互。

常见问题解答

  1. 为什么使用 tee 而不是 |

    | 将数据管道到另一个命令,而 tee 将数据同时管道到一个文件和标准输出。因此,tee 可以让我们同时将数据重定向到文件中并将其显示在终端上。

  2. 是否可以将 Stderr 和 Stdout 分别重定向到不同的文件?

    是的,可以使用 2>2>&1 重定向符分别将 Stderr 和 Stdout 重定向到不同的文件。

  3. 使用 tee 会对性能产生影响吗?

    tee 的性能影响通常很小,因为它只是一个管道命令。但是,如果需要处理大量数据,可以使用 stdbuf 命令来提高性能。

  4. 除了重定向之外,tee 还有哪些其他用途?

    tee 还可用于显示命令的输出、将数据附加到文件或过滤数据。

  5. 在哪些情况下使用 tee 特别有用?

    tee 在需要同时记录命令的输出并将其显示在终端上的情况下非常有用,例如调试脚本或监视进程的输出。