linux标准输入/输出/错误及重定向

标准输入/输出/错误

linux下每个进程在运行的过程中都会打开一系列的文件,可以通过lsof -p $pid来查看进程号为pid打开的文件,在/proc/pid/fd/下是该进程打开的文件的链接。其中有三个比较特殊的文件是每个进程都会打开,其文件描述符分为0,1,2,默认分别链接到标准输入(STDIN_FILENO)设备(/dev/stdin)、标准输出(STDOUT_FILENO)设备(/dev/stdout)、标准错误(STDERR_FILENO)(/dev/stderr)设备。

进程在运行的过程中默认情况下产生的输出会写到stdout文件,产生的错误信息写到stderr文件,默认这两个文件会链接到屏幕设备,许多进程从标准输入stdin获取输入,默认链接为键盘设备。如果更改这几个文件的链接位置,就可以实现对其他文件的输入输出。

更换标准输入/输出/错误

  • >: 输出重定向到一个文件或设备,覆盖原来的内容
  • >>: 输出重定向到一个文件或设备,追加到末尾
  • <: 输入重定向一个程序
  • <<
  1. 输出
# echo hello > out.log
# echo hello 1> out.log

这两个命令的作用是相同的,都是讲echo进程的输出重定向到out.log文件,在这里>左边的1可以省略。

  1. 错误
# echo hello 2> err.log
hello
# echoo hello 2> err.log

2>表示将进程的错误信息重定向到err.log文件,第一行的命令没有错误信息,因此会输出hello到标准输出,即会显示到屏幕上,第二行输出了一个不存在的指令,这时的错误输出信息会输入到err.log中。

如果需要把输出信息和错误信息都重定向到某个文件:

# echoo hello 1> err.log 2>&1

这里的1>和前面的用法相同,2>&1是将错误信息追加到标准输出中。>&是一个整体,不可分开。

一些例子:

# 错误信息重定向到标准输出,输出重定向到out.log
# cat file 2>&1 >out.log
# 将输出重定向到out.log,错误定向到输出
# cat file >out.log 2>&1
# 将错误和输出重定向更简单的写法
# cat file &> out.log
  1. 输入

将一个命令的输入重定向为其他文件。

# cat < file.in

另外还有一种<<的方式,称为here文档,它会从标准输入中持续读入字符,直到匹配到指定的token读取结束。例如cat命令:

cat << EOF > out.log
> hello
> world
> EOF

这种方式是将cat 命令的输出重定向到out.log中,其内容是从第二行开始到EOF之前结束,EOF是结束token,可以人为指定为其他字符,例如:

cat << ENDOFFILE > out.log
> 1
> 2
> 3
> ENDOFFILE

另一种写法是

cat > out.log << EOF
> 1
> 2
> 3
> ENDOFFILE

结果和上面的一致。