在 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 的作用是什么呢?以下进行详解。
计算机中有各种各样的硬件设备,比如键盘、鼠标、麦克风等输入设备,显示器、打印机等输出设备。这些设备在 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 | 显示器 |
在执行 shell 命令中,一般都默认是从键盘获得输入,并且将结果输出到控制台。有了重定向,我们就可以通过更改文件描述符默认的指向,实现输入输出的重定向。
Linux Shell 重定向分为两种:输入重定向和输出重定向。
输入重定向的写法是 fd<file 或 fd<<file,其中 fd 表示文件描述符,如果不写,默认为 0。
注意:fd 和 < 之间不能有空格,否则 Shell 会解析失败;< 和 file 之间的空格可有可无。
输出重定向的写法是 fd>file 或 fd>>file,> 代表覆盖,>> 代表追加。
注意:fd 和 > 之间不能有空格,否则 Shell 会解析失败;> 和 file 之间的空格可有可无。
文件描述符使用 “&” 进行复制,表示复制文件描述符到另一个文件描述符中以作其副本。
命令 | 说明 | 示例 | 输出 |
---|---|---|---|
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 |
执行某个命令但又不希望在屏幕上显示输出结果,可以将输出重定向到 /dev/null:
command > /dev/null
将错误输出和标准输出输出到同一个地方。
Linux 在执行 shell 命令之前,就会确定好所有的输入输出位置,并且从左到右依次执行重定向的命令。
我们一般使用 nohup command & 命令形式来启动一些后台程序,比如本文第一节问题描述的例子,为了不让执行信息输出屏幕,加上 >/dev/null 2>&1 命令来丢弃所有的输出,使 shell 的状态置为完成。