【linux命令】Linux shell中 2>&1的含义解释(标准输入输出)及nohup后台启动

您所在的位置:网站首页 输出重定向的符号是什么 【linux命令】Linux shell中 2>&1的含义解释(标准输入输出)及nohup后台启动

【linux命令】Linux shell中 2>&1的含义解释(标准输入输出)及nohup后台启动

2024-06-02 08:20| 来源: 网络整理| 查看: 265

文章目录 1. 首先了解下1和2在Linux中代表什么1.1 重定向1.2 标准操作符1.3 关于2>&1的含义1.3.1 把标准输出和标准错误输出分别指定到不同的文件中1.3.2 把标准输出和标准错误输出指定到同一个文件中 2. nohup后台启动

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 等》



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3