标准输入/输出/错误
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获取输入,默认链接为键盘设备。如果更改这几个文件的链接位置,就可以实现对其他文件的输入输出。
更换标准输入/输出/错误
>
: 输出重定向到一个文件或设备,覆盖原来的内容>>
:输出重定向到一个文件或设备,追加到末尾<
: 输入重定向一个程序<<
- 输出
# echo hello > out.log
# echo hello 1> out.log
这两个命令的作用是相同的,都是讲echo进程的输出重定向到out.log文件,在这里>左边的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
- 输入
将一个命令的输入重定向为其他文件。
# 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
结果和上面的一致。