bash 编程新手。我不确定“输出到标准输出”是什么意思。这是否意味着打印到命令行?
如果我有一个简单的 bash 脚本:
#!/bin/bash
wget -q http://192.168.0.1/test -O - | grep -m 1 'Hello'
它向终端输出一个字符串。这是否意味着它正在“输出到标准输出”?
谢谢
是的,stdout 是终端(除非它使用>
运算符重定向到文件或使用 重定向到另一个进程的标准输入|
)
在您的具体示例中,您实际上是| grep ...
通过 grep 重定向到终端。
Linux 系统(以及大多数其他系统)上的每个进程至少有 3 个打开的文件描述符:
常规的每个文件描述符都将指向启动进程的终端。像这样:
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
除非重定向,否则标准输出是启动程序的文本终端。
这是一篇维基百科文章:http ://en.wikipedia.org/wiki/Standard_streams#Standard_output_.28stdout.29