文章目录
1. 首先了解下1和2在Linux中代表什么
在Linux系统中0、1、2是一个文件描述符,如下图所示:
从图中可以看到1代表标准输出,什么是标准输出?就是往屏幕上输出!
同样的0代表标准输入,就是键盘输入!
标准错误输出,就是往屏幕上显示错误信息!
0, 1 和 2 常与操作符一起用,表示输入重定向或输出重定向!
1.1 重定向
什么是重定向?我们先来看下不重定向,也就是默认输出:
echo "hello"
默认的输出就是输出到屏幕上,那么通过重定向符,我们可以改变原本要输出到屏幕的行为,改为输出到指定的文件中,常见的是日志文件之类的场景:
echo "hello" > t.log
这样,我们就把屏幕的输出重定向至t.log 文件中,> 表示重定向符,t.log表示目标文件
1.2 标准操作符
从前文的表格中看的出来,我们平时使用的 “>”
符合实现重定向效果:
echo "hello" > t.log
其实也可以写成 “1>”
:
echo "hello" 1> t.log
使用 > 或 >> 时,默认为标准输出 1 重定向, 所以 > file
就是 1> file
的省写,1 与 > 之间不能有空格。数字 0, 1, 2 与它后面的操作符 > 或 < 等 总是一个整体.
1.3 关于2>&1的含义
2 代表错误标准输出,1代表标准输出,“2>&1
”是一种优化写法,表示把标准错误输出也输出到标准输入所指定的文件中。
我们先来看下标准输出:
[root@test]# ls test
a.txt
ls命令也提供标准输出,和echo一样,会把结果输出到屏幕上,test文件夹下有a.txt文件。
我们可以把标准输出重定向到指定的文件中:
[root@test]$ ls test >succ.log `重定向到succ.log中 `
[root@test]$ cat succ.log `查看succ.log`
a.txt `原本输出到屏幕的内容果然也重定向到了指定的文件中`
下面我们看下什么是错误输出:
[root@test]# ls xxx
ls: cannot access xxx: No such file or directory
我们ls命令查看一个不存在的文件xxx,命令执行后,会打印文件不存在的提示信息,这个信息就是错误输出,是操作系统产生的一种输入类型,要和标准输出进行区分开。
我们可以把标准错误输出重定向到指定的文件中:
[root@test]# ls xxx 2> err.log
[root@test]# cat err.log
ls: cannot access xxx: No such file or directory
1.3.1 把标准输出和标准错误输出分别指定到不同的文件中
那么我们有这样的需求,当产生标准输出时指定到succ.log中,当产生标准错误时输出到error.log中,那么语法如下:
[root@test]$ ls test >succ.log 2>err.log `test文件夹真实存在,产生标准日志`
[root@test]$ cat succ.log
a.txt
[root@test]$ ls xxx >succ.log 2>err.log `xxx文件夹不存在,产生错误日志`
[root@test]$ cat err.log
ls: cannot access xxx: No such file or directory `果然错误日志被重定向到err.txt`
1.3.2 把标准输出和标准错误输出指定到同一个文件中
基于1.3.1,我们有这样的需求,当产生标准输出时指定到my.log中,当产生标准错误时输出也到my.log中,也就是说不管错误的输出,还是标准的输出,我都打印到一个文件中,那么语法如下:
[root@test]$ ls test >my.log 2>my.log `test文件夹真实存在,产生标准日志`
[root@test]$ ls xxx >my.log 2>my.log `xxx文件夹不存在,产生错误日志`
那么既然两种输出指定同一个文件,有没有优化的语法,可以简单一些呢?如果文件名称很长,那么影响编写的阅读性!
有,“2>&1”闪亮登场,可以解决我们刚才的问题,代表将标准错误输出重定向到标准输出,什么意思呢,很简单,符号>&
是一个整体,不可分开 。:
[root@test]$ ls test >my.log 2>& 1
[root@test]$ ls xxx >my.log 2>& 1
为什么符号>&
是一个整体,不可分开 ?
">"表示重定向,但是为了避免把1当成普通文件1,通过>&1
,表示指向一个对象1,对象1对应着前面的标准输出!
为了提高可读性,虽然还有一些简写方案,简写成“2&1”,但建议尽量保留 2 >& 1
语法
2. nohup后台启动
后台启动可以让用户继续操作shell窗口,避免被上一个命令占住界面。
后台启动有2种方法,一种是临时的,一种是永久的
&是临时的,当前shell窗口一旦关闭,那么这个进程也就随之关闭
:
# 执行文件
./test.py & //在待执行的shell脚本或py脚本后面使用& ,注意要有一个空格
# 查看是否在后台运行
ps -ef|grep test //通过进程可以查看到启动的服务
另一个钟就是nohup ,可以真正实现后台启动,及时你关闭当前的shell窗口,进程也会在后台继续存在
语法:nohup ./test.sh &
注意:使用nohup语法时,仍然需要使用 & 符号,否则界面仍然会卡住,不能操作其他命令
由于输出语法 >、>>、1>、1>> 均是等价的,因此下面命令也就是相同的:
nohup ./test.sh >out.log 2>&1 &
nohup ./test.sh >>out.log 2>&1 &
nohup ./test.sh 1>out.log 2>&1 &
nohup ./test.sh 1>>out.log 2>&1 &
参考:
《Linux shell中2>&1的含义解释 (全网最全,看完就懂)》
《Linux 输入输出重定向, &>file, 2>&1, 1>&2 等》