输出重定向
输出重定向是一种把命令输出结果保存到文件中,而不是直接显示在屏幕上的方法,最常见的一种用法是配合nohup实现命令后台执行,防止因为关闭命令终端导致执行终止。比如,我们希望在后台执行一个可能会耗费很长时间的python文件test.py,用nohup命令写就可以是:
nohup python -u test.py > test.txt 2>&1 &
表示的含义就是在后台执行python -u test.py命令,并把输出结果重定向保存到test.txt文件中。
回车符\r
回车符\r(注意,\n是换行,虽然我们经常把它叫做“回车”,但两者不一样)表示把光标移动到本行的头部,在继续输出时就相当于覆盖了本行内容,而不是另起一行。回车符最常见的用法就是用来实现进度条,例如python的tqdm库为我们封装了进度条功能,把下面这些代码保存为test.py:
from tqdm import tqdm
import time
for i in tqdm(range(10000)):
time.sleep(0.001)
print('Finish')
在终端运行命令python test.py,效果如图所示
两者共用存在的问题
如果我们输出重定向的命令输出中包含回车符,问题就出现了:在保存的输出文件里\r无法起到回车的作用。例如我们执行*nohup python -u test.py > test.txt 2>&1 &*命令,查看test.txt,显示结果是这样的:
这样十分不美观,尤其是如果进度条时间比较长,就会给查看重要信息带来很多干扰。
解决方法
我们所希望的理想情况就是把进度条输出和重要的其他输出信息分开,那么我们只需要创建一个.sh脚本文件作为中介就能实现这个效果。
- 首先新建一个cmd.sh文件,文件中写上我们需要执行的命令并把输出结果重定向到test.txt文件中,掐头去尾不写nohup;
python -u test.py > test.txt
cmd.sh:
- 使用nuhup把cmd.sh放到后台执行,并把输出重定向到另一个cmd.txt文件中;
nohup bash cmd.sh > cmd.txt 2>&1 &
- 运行结束后,分别查看cmd.txt和test.txt,可以看到进度条输出被放到了cmd.txt中,test.txt中仅包含其他的重要输出信息。
cmd.txt:
test.txt: