42

在 bash 中,标准 (1) 和错误 (2) 输出可以通过以下方式重新路由和丢弃:

>/dev/null 2>&1

但是下面的例子做了一些不同的事情:

nohup myscript.sh >myscript.log 2>&1 </dev/null &

</dev/null上面示例中的含义/功能是什么?在什么样的脚本场景中会有用?

(示例来源)


重定向/dev/null到标准输入将立即EOF对该进程的任何读取调用。这对于将进程与 tty 分离通常很有用(这样的进程称为守护进程)。例如,当通过 ssh 远程启动后台进程时,您必须重定向 stdin以防止进程等待本地输入。

重定向到 /dev/null 的另一个原因是防止为标准输入创建未使用的文件描述符。当您有许多长时间运行的进程时,这可以最大限度地减少打开的文件句柄总数。

4

4 回答 4

51

重定向/dev/null到标准输入将立即EOF对该进程的任何读取调用。这对于将进程与 tty 分离通常很有用(这样的进程称为守护进程)。例如,当通过 ssh 远程启动后台进程时,必须重定向 stdin以防止进程等待本地输入。

重定向到 /dev/null 的另一个原因是防止为标准输入创建未使用的文件描述符。当您有许多长时间运行的进程时,这可以最大限度地减少打开的文件句柄总数。

于 2013-11-13T13:47:33.637 回答
49

</dev/null用于避免让脚本等待输入。

引用< /dev/null & 在命令行中的用法

< /dev/null用于立即将 EOF 发送给程序,使其不等待输入 ( /dev/null,空设备,是一个特殊文件,它丢弃所有写入它的数据,但报告写操作成功,并且不提供数据给任何从中读取的进程,立即产生 EOF)。&是一种特殊类型的命令分隔符,用于后台处理前面的进程。

所以命令:

nohup myscript.sh >myscript.log 2>&1 </dev/null &
# |               ^^^^^^^^^^^^^ ^^^^ ^^^^^^^^^^ ^
# |                    |           |      |     run in background
# |                    |           |      |     
# |                    |           |   don't expect input
# |                    |           |   
# |                    |           redirect stderr to stdout
# |                    |           
# |                    redirect stdout to myscript.log
# |
# keep running the command no matter whether the connection is lost or you logout

将移动到后台命令,将 stdout 和 stderr 都输出到,myscript.log而无需等待任何输入。

于 2013-11-13T14:26:41.557 回答
4

</dev/null为脚本提供空输入...

于 2013-11-13T13:47:56.603 回答
3

这是一种关闭的方式stdin,就好像EOF( ^D) 被发送给它一样。在本例中,它可以与mail命令一起使用,以表示该命令不应再期望来自 的输入stdin

它还经常用于守护进程(创建行为良好的守护进程的推荐方法的第6 步)

于 2013-11-13T13:48:22.167 回答