在 bash 中,标准 (1) 和错误 (2) 输出可以通过以下方式重新路由和丢弃:
>/dev/null 2>&1
但是下面的例子做了一些不同的事情:
nohup myscript.sh >myscript.log 2>&1 </dev/null &
</dev/null
上面示例中的含义/功能是什么?在什么样的脚本场景中会有用?
在 bash 中,标准 (1) 和错误 (2) 输出可以通过以下方式重新路由和丢弃:
>/dev/null 2>&1
但是下面的例子做了一些不同的事情:
nohup myscript.sh >myscript.log 2>&1 </dev/null &
<
在 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 的另一个原因是防止为标准输入创建未使用的文件描述符。当您有许多长时间运行的进程时,这可以最大限度地减少打开的文件句柄总数。
重定向/dev/null
到标准输入将立即EOF
对该进程的任何读取调用。这对于将进程与 tty 分离通常很有用(这样的进程称为守护进程)。例如,当通过 ssh 远程启动后台进程时,必须重定向 stdin以防止进程等待本地输入。
重定向到 /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
而无需等待任何输入。
</dev/null
为脚本提供空输入...
这是一种关闭的方式stdin
,就好像EOF
( ^D
) 被发送给它一样。在本例中,它可以与mail
命令一起使用,以表示该命令不应再期望来自 的输入stdin
。
它还经常用于守护进程(创建行为良好的守护进程的推荐方法的第6 步)