好记忆,不如烂笔头,趁热记录下,给未来的自己
0 | 先说定论
先看看chatGPT怎样说:
我的了解:
-
2 表明 linux 的 stderr(规范过错输出) 的文件描述符,也便是说 假如 linux shell 履行一个指令(比如:
pip install -y something >1.log 2>2.log
),假如代码里抛出了反常过错,那么这个过错日志会被输出到 stderr,也便是其对应的文件描述符 2,也便是2.log
- > 表明 重定向
- & 表明 等同于
- 那么 >&1 表明 等同于重定向到 1
-
1 表明 linux 的 stdout(规范输出)的文件描述符,那么
pip install -y something >1.log 2>2.log
就会将正常的日志重定向到1.log
- 另外,我们也经常看到这样的指令
apt-get update -y >/dev/null 2>&1
, 作用是更新apt包的时候不显示log。能够这么了解:>/dev/null
等同于1>/dev/null
(默认 1 能够不写),表明 stdout 的日志重定向到/dev/null
;2>&1
表明 stderr 这个管道接到 1,也便是 stdout,再重定向到/dev/nul
;/dev/null
是一个 linux 不存在的设备,能够了解成一个黑洞,一切重定向到这儿的文件都会被吞噬。
到这儿,相信我们对这个指令已经了解了。假如你对这个指令的使用场景感兴趣,能够持续往下看。
1 | 还原场景
以 huggingface 的调试页面举例:
能够看到,容器的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 是空的。
-
pip install onnx1 >1.log 2>2.log
那么针对这个指令,履行完,1.log 里是空的,而 2.log 是报错信息。
-
pip install onnx2 >>1.log 2>&1
那么针对这个指令,履行完,1.log 里有报错信息,2.log 是空的。
3 | 几点感悟
其实这是一个实践的事务需求转换出来的一篇文章,在解决这个问题的进程中,有几点感悟,一吐为快:
- 工程上的东西,真的没啥门槛,也没啥隐秘,只要有人能做出来,那就必定能做出来;
- 关于搞后端,搞 devops 的人来说,linux 真的得好好学习;
- 有对标的产品能够“抄”, 真的很爽,虽然工程上的技术是黑盒,可是关于有经历的开发同学来说,基本便是明盘了。
所以,你了解 2>&1 了么?
以上