I/O重定向– STDIN,STDOUT,STDERR流

时间:2020-03-21 11:45:53  来源:igfitidea点击:

Unix和Linux将数据流和外围设备文件视为文件。
默认情况下,始终打开三个文件,stdin(键盘),stdout(显示)和stderr(屏幕上输出的错误消息)。
与每个打开的文件一样,可以重定向这三个文件。
例如,您可以重定向(捕获)命令,文件,脚本的输出,并将其作为输入发送到另一个命令,文件或者脚本。

在UNIX和Linux中,每个打开的文件都分配有一个文件描述符。
操作系统(UNIX和Linux)需要跟踪打开的文件,并通过为打开的文件分配一个编号来做到这一点。
(文件描述符可以被视为C编程语言中文件指针或者文件句柄的简化类型。
stdin,stdout和stderr的文件描述符为0、1和2。
还有文件描述符3至9,可以这些剩余的文件描述符可用于将stdin,stdout或者stderr分配为临时重复链接。

重定向标准输出流的命令语法

重定向stdout流使用>或者>>符号完成。
命令语法如下:

output > file

将输出(stdout)重定向到文件。
如果不存在该文件,则创建该文件,否则它将覆盖该文件。

output >> file

将输出(stdout)重定向到文件。
如果不存在则创建该文件,否则将附加到该文件。

重定向标准输出流示例

让我们看一下Linux系统命令行上的一些实际示例。

> somefile

>将名为somefilename的文件截断为零长度。
如果该文件不存在,它将创建一个长度为零的文件(效果与" touch"命令(touch somefilename)相同)。

ls –l > listfile

此命令列出当前目录的内容,并将输出写入名为listfile的文件。

我们还可以使用文件描述符编号:

filedescriptor > filename

默认文件描述符为1,但您也可以设置它。
您可以在单行重定向命令中使用它们。
这是仅影响其所在行的命令。
例如,在脚本中执行回显后将标准输出重定向到文件。
一些单行重定向:

# 将stdout重定向到文件“filename”
1> filename
# 重定向并将stdout附加到文件“filename”
1>>filename
# 将stderr重定向到文件“filename”
2> filename
# 重定向并将stderr附加到文件“filename”
2>>filename
# 将stdout和stderr重定向到文件“filename”
&>filename

我们可以在脚本中使用单行重定向,例如将消息回显到日志文件。
(使用vi script.sh打开文件,然后将以下行复制到该文件中。
通过/bin/bash script.sh运行该脚本)。

LOGFILE=script.log

echo "This statement is sent to the log file" 1>$LOGFILE
echo "This statement is appended to the log file” 1>>$LOGFILE
echo "This statement is also appended to the log file" 1>>$LOGFILE
echo "This statement is echoed to stdout. It will not appear in the log”

重定向stderr流示例

让我们看一下Linux系统命令行上的一些stderr示例。

2>&1

在上面的示例中,我们向您显示了将stderr重定向到stdout的单行重定向。
每个错误消息将被发送到与标准输出相同的位置(默认为屏幕)。
重定向stdout和stderr(如果存在,则覆盖文件)。

cmd &> file.txt

重定向stdout和stderr追加到文件都可以使用以下语法完成:

cmd >> file.txt 2>&1

关闭文件描述符

例如,也可以关闭文件描述符,从而关闭输入文件描述符n。

n&

关闭标准输入。

0<&-, <&- 

关闭输出描述符n。

n>&- 

关闭标准输出。

1>&-, >&-