stdin/stdout/stderr 的理解
2021-12-19 本文已影响0人
旭日丶丶
- 类Unix系统都是以文件为单位输入输出:
- 文件描述符
0
- stdin: Unix 输入文件/流 - 文件描述符
1
- stdout: Unix 输出文件/流 - 文件描述符
2
- stderr: Unix 异常信息文件/流
- 文件描述符
-
文件描述符
可以理解为缓存文件
, 不会保存到磁盘上 -
文件
那就是我们磁盘上的文件了 - 默认在终端上打命令显示(你可以看到的)出来的所有内容, 都输出到了
缓存文件
里, 正常的输出到了信息stdout
, 异常信息都输出到了stderr
, 所以你看到的所有内容是stdout
+stderr
>和&
-
>name
: 语法:文件描述符(可选)>文件名
, 意思是把一个左边的文件描述符(默认1
- stdout)输出到一个右边的name
文件里 -
&>name
- 语法:文件描述符(可选)&>文件名
等同于1>name 2>name
, 意思是把1
-stdout输出到右边的name
文件里, 同时把2
- stderr也输出到右边的name
文件里 -
>&
- 语法:文件描述符(可选)>&文件描述符
,&
把>
输出的文件
转换为了文件描述符
, 因此右边可以加|grep
过滤了 - 此时大家可以试试各种命令情况
docker logs
-
docker logs cotainer_id >1.txt
: 只有stdout信息到1.txt里(>
左边没指定值默认为1
- stdout) -
docker logs cotainer_id 2>1.txt
: 只有stderr信息到1.txt里, 这里的2
代表stderr
-
docker logs cotainer_id &>1.txt
: stdout和stderr都输出到1.txt里 -
docker logs cotainer_id 2&>1.txt
: 等同于docker logs cotainer_id 2 1>1.txt 2>1.txt
, 把命令里的2
作为参数, 传到了前面的命令中, 等同于docker logs container_id 2
, 此时,1.txt
里会出现:
"docker logs" requires exactly 1 argument.
See 'docker logs --help'.
Usage: docker logs [OPTIONS] CONTAINER
Fetch the logs of a container
你试试docker logs cotainer_id 2
是不是终端里也会出现一样的内容?
docker logs container_id 2>&1 |grep ...
ref:
- https://stackoverflow.com/questions/24793069/what-does-do-in-bash
- https://stackoverflow.com/questions/11255447/what-does-mean/11255498
- https://stackoverflow.com/questions/3385201/confused-about-stdin-stdout-and-stderr
- https://stackoverflow.com/questions/34724980/finding-a-string-in-docker-logs-of-container/38207098