在跑视频数据集的时候,经常看到脚本文件中出现了 sh run_pascal.sh 2>&1 | tee train.log 类似的用法,那么2>&1究竟是怎么用的呢?
在linux中,0表示标准输入,即stdin;1表示标准输出,即stdout;2表示标准错误,即stderr。
>表示重定向,&表示取地址,那么&1就是取到了标准输出的地址,也就是 2>&1表示的是将标准错误重定向到了标准输出,也就是将运行脚本中出错的信息重定向到了标准输出。
举例:
ls 2>1测试一下,由于ls命令会列出当前目录的文件列表,不会产生错误信息,于是会产生一个空的文件1。
ls xxx 2>1测试,ls xxx会列出xxx的文件列表,如果没有xxx文件,会产生错误信息,于是会产生一个有错误信息的文件1。
ls xxx 2>&1测试,如果没有xxx文件,会产生错误信息在屏幕上,即标准输出。
ls xxx >out.txt 2>&1, 实际上就是ls xxx 1>out.txt 2>&1。如果没有xxx文件,会产生一个标准错误重定向到了标准输出,而标准输出又重定向到了out.txt,于是结果会产生一个有错误信息的文件out.txt。如果有xxx文件,那么结果会将输出存入文件out.txt。总的说来,就是将输出和错误都存入了文件out.txt。
那么sh run_pascal.sh 2>&1 | tee train.log 也就好理解了,就是将sh run_pascal.sh的运行结果(输出和错误)都重定向到标准输出,同时,利用tee命令将信息存入train.log文件。