- 类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