stdin/stdout/stderr 的理解

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

你可能感兴趣的:(stdin/stdout/stderr 的理解)