好记忆,不如烂笔头,趁热记录下,给未来的自己

0 | 先说定论

先看看chatGPT怎样说:

Linux的这个命令相信很多人还是不理解 | 2>&1

我的了解:

  1. 2 表明 linux 的 stderr(规范过错输出) 的文件描述符,也便是说 假如 linux shell 履行一个指令(比如:pip install -y something >1.log 2>2.log),假如代码里抛出了反常过错,那么这个过错日志会被输出到 stderr,也便是其对应的文件描述符 2,也便是 2.log
  2. > 表明 重定向
  3. & 表明 等同于
  4. 那么 >&1 表明 等同于重定向到 1
  5. 1 表明 linux 的 stdout(规范输出)的文件描述符,那么 pip install -y something >1.log 2>2.log 就会将正常的日志重定向到 1.log
  6. 另外,我们也经常看到这样的指令 apt-get update -y >/dev/null 2>&1, 作用是更新apt包的时候不显示log。能够这么了解:>/dev/null 等同于 1>/dev/null(默认 1 能够不写),表明 stdout 的日志重定向到 /dev/null2>&1 表明 stderr 这个管道接到 1,也便是 stdout,再重定向到 /dev/nul/dev/null 是一个 linux 不存在的设备,能够了解成一个黑洞,一切重定向到这儿的文件都会被吞噬。

到这儿,相信我们对这个指令已经了解了。假如你对这个指令的使用场景感兴趣,能够持续往下看。

1 | 还原场景

以 huggingface 的调试页面举例:

Linux的这个命令相信很多人还是不理解 | 2>&1
能够看到,容器的log里假如有报错的话,前端页面上是会获取到并展现出来的。这个怎样完成的?或者说假如要去完成,能想到什么方法?

通常的做法一般是写一个过滤器去辨认容器里的日志,经过关键词过滤,正则匹配等方式获取日志里的特定信息。 这种方法有种显而易见的不稳定点:假如日志的报错信息多种多样,五花八门,这个过滤器就会失效或者掩盖不完全。

那么,假如了解了 linux 的管道 2>&1,stdout,stderr 这些知识点,那么这个恳求就能够很轻松的完成。

2 | 模仿完成

用以下三个指令来模仿完成。这三个指令是经过pip来装置包,其间 onnx 是存在的装置进程不会报错,onnx1/onnx2 是不存在的,装置进程会报错。

touch 1.log 2.log
pip install -y onnx >1.log 2>2.log
pip install -y onnx1 >1.log 2>2.log
pip install -y onnx2 >1.log 2>&1
  • pip install onnx >1.log 2>2.log 那么针对这个指令,履行完,1.log 里有装置的日志,而 2.log 是空的。

Linux的这个命令相信很多人还是不理解 | 2>&1

  • pip install onnx1 >1.log 2>2.log 那么针对这个指令,履行完,1.log 里是空的,而 2.log 是报错信息。

Linux的这个命令相信很多人还是不理解 | 2>&1

  • pip install onnx2 >>1.log 2>&1 那么针对这个指令,履行完,1.log 里有报错信息,2.log 是空的。

Linux的这个命令相信很多人还是不理解 | 2>&1

3 | 几点感悟

其实这是一个实践的事务需求转换出来的一篇文章,在解决这个问题的进程中,有几点感悟,一吐为快:

  1. 工程上的东西,真的没啥门槛,也没啥隐秘,只要有人能做出来,那就必定能做出来;
  2. 关于搞后端,搞 devops 的人来说,linux 真的得好好学习;
  3. 有对标的产品能够“抄”, 真的很爽,虽然工程上的技术是黑盒,可是关于有经历的开发同学来说,基本便是明盘了。

所以,你了解 2>&1 了么?

以上