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

本文详细解析了Linux系统中的重定向操作,包括标准输出、标准错误输出的概念及如何使用2>&1语法同时捕获这两种输出。此外,还介绍了如何利用nohup命令实现进程的后台启动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值