3

bash 编程新手。我不确定“输出到标准输出”是什么意思。这是否意味着打印到命令行?

如果我有一个简单的 bash 脚本:

#!/bin/bash
wget -q  http://192.168.0.1/test -O -  | grep -m 1 'Hello'

它向终端输出一个字符串。这是否意味着它正在“输出到标准输出”?

谢谢

4

3 回答 3

3

是的,stdout 是终端(除非它使用>运算符重定向到文件或使用 重定向到另一个进程的标准输入|

在您的具体示例中,您实际上是| grep ...通过 grep 重定向到终端。

于 2013-04-10T23:31:21.980 回答
2

Linux 系统(以及大多数其他系统)上的每个进程至少有 3 个打开的文件描述符:

  • 标准输入 (0)
  • 标准输出 (1)
  • 标准错误 (2)

常规的每个文件描述符都将指向启动进程的终端。像这样:

cat file.txt # all file descriptors are pointing to the terminal where you type the      command

但是,bash 允许使用输入/输出重定向来修改此行为:

cat < file.txt # will use file.txt as stdin

cat file.txt > output.txt # redirects stdout to a file (will not appear on terminal anymore)

cat file.txt 2> /dev/null # redirects stderr to /dev/null (will not appear on terminal anymore

当您使用管道符号时也会发生同样的情况,例如:

wget -q  http://192.168.0.1/test -O -  | grep -m 1 'Hello'

实际发生的是 wget 进程的标准输出( | 之前的进程)被重定向到 grep 进程的标准输入。所以 wget 的 stdout 不再是终端,而 grep 的输出是当前终端。例如,如果要将 grep 的输出重定向到文件,请使用以下命令:

wget -q  http://192.168.0.1/test -O -  | grep -m 1 'Hello' > output.txt
于 2013-04-10T23:33:04.787 回答
1

除非重定向,否则标准输出是启动程序的文本终端。

这是一篇维基百科文章:http ://en.wikipedia.org/wiki/Standard_streams#Standard_output_.28stdout.29

于 2013-04-10T23:32:34.297 回答