>/dev/null 2>&1详解

一、问题引入

在 Linux shell 文件 testshell.sh 中写入了以下命令:

vi testshell.sh
nohup java -Xmx256m -Xms128m -Xss256k  -jar manager-api.jar > logs/manager.out & 

那么在判断 testshell.sh 是否执行完成时是无法正确判断的,testshell.sh 一直是未完成的状态。

二、解决方法

在语句中加入 >/dev/null 2>&1 就可以正常判断了。

nohup java -Xmx256m -Xms128m -Xss256k  -jar manager-api.jar > logs/manager.out >/dev/null 2>&1 & 


那么,>/dev/null 2>&1 的作用是什么呢?以下进行详解。

三、>/dev/null 2>&1 详解

1.文件描述符

计算机中有各种各样的硬件设备,比如键盘、鼠标、麦克风等输入设备,显示器、打印机等输出设备。这些设备在 Linux 中都以文件表示。其中,键盘是标准输入设备,显示器是标准输出设备。
Linux 会给每个文件分配一个 ID,这个 ID 是一个整数,被称为文件描述符。与输入输出相关的文件描述符为 0、1、2,对应的目标文件分别为 /dev/stdin、/dev/stdout、/dev/stderr,分别表示标准输入、标准输出、和标准错误。

文件描述符 文件名  类型     目标文件  设备
0 stdin  标准输入 /dev/stdin 键盘
1 stdout     标准输出 /dev/stdout 显示器
2 stderr     标准错误  /dev/stderr 显示器

2.shell 重定向

在执行 shell 命令中,一般都默认是从键盘获得输入,并且将结果输出到控制台。有了重定向,我们就可以通过更改文件描述符默认的指向,实现输入输出的重定向。
Linux Shell 重定向分为两种:输入重定向和输出重定向。

(1)输入重定向

输入重定向的写法是 fd

注意:fd 和 < 之间不能有空格,否则 Shell 会解析失败;< 和 file 之间的空格可有可无。

(2)输出重定向

输出重定向的写法是 fd>file 或 fd>>file,> 代表覆盖,>> 代表追加。

注意:fd 和 > 之间不能有空格,否则 Shell 会解析失败;> 和 file 之间的空格可有可无。

(3)文件描述符的复制

文件描述符使用 “&” 进行复制,表示复制文件描述符到另一个文件描述符中以作其副本。

(4)重定向命令列表

命令 说明 示例 输出
command > file 将输出重定向到file date > test.log Tue Mar 22 14:39:06 CST 2022
command < file 将输入重定向到file  wc -l < test.log     1
command >> file 将输出以追加的方式重定向到file date >> test.log Tue Mar 22 14:39:06 CST 2022
Tue Mar 22 14:44:08 CST 2022
n> file 将文件描述符为n的文件重定向到file  date 2> test.log  文件内容为空
n>> file 将文件描述符为n的文件以追加的方式重定向到file date 1>> test.log Tue Mar 22 14:54:01 CST 2022
n>&m 将输出文件 m 和 n 合并 2>&1 标准错误 stderr 重定向到标准输出 stdout
n<&m 将输入文件 m 和 n 合并
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入  [root@localhost test]# wc -l << EOF
> hi
> 你好
> 谢谢
> EOF    
3

3. /dev/null

执行某个命令但又不希望在屏幕上显示输出结果,可以将输出重定向到 /dev/null:

command > /dev/null

4. 2>&1

将错误输出和标准输出输出到同一个地方。

5.重定向顺序

Linux 在执行 shell 命令之前,就会确定好所有的输入输出位置,并且从左到右依次执行重定向的命令。

(1)>/dev/null 2>&1 和 2>&1 >/dev/null

  • command >/dev/null 2>&1 执行结果:标准输出、错误输出都会被丢弃。
  • command 2>&1 >/dev/null 执行结果:标准输出丢弃、错误输出在屏幕显示。

(2)">file 2>&1" 和 “2>&1 >file”

  • “>file 2>&1” 执行结果:标准输出重定向到file上,标准错误也重定向到file上。
  • “2>&1 >file” 执行结果:标准输出重定向到file上,标准错误输出到屏幕上。

6.nohup

我们一般使用 nohup command & 命令形式来启动一些后台程序,比如本文第一节问题描述的例子,为了不让执行信息输出屏幕,加上 >/dev/null 2>&1 命令来丢弃所有的输出,使 shell 的状态置为完成。
 

你可能感兴趣的:(linux,#,麒麟,#,ubuntu,linux,运维,服务器)