【问题标题】:What is </dev/null in bash?bash 中的 </dev/null 是什么?
【发布时间】:2013-11-26 03:23:54
【问题描述】:

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

>/dev/null 2>&1

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

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

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

(Example Source)

【问题讨论】:

  • 进程如果与本地 TTY 有任何连接,则无法分离。这用 /dev/null 上的句柄替换 FD 0 标准输入。

标签: bash


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    &lt;/dev/null 用于避免脚本等待输入。

    引用the usage of < /dev/null & in the command line:

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

    所以命令:

    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 而无需等待任何输入。

    【讨论】:

      【解决方案3】:

      &lt;/dev/null 为脚本提供空输入...

      【讨论】:

        【解决方案4】:

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

        它也经常用于守护进程(the recommended approach for creating well-behaved daemons 的第 6 站)

        【讨论】:

          猜你喜欢
          • 2012-05-17
          • 1970-01-01
          • 1970-01-01
          • 2021-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-14
          相关资源
          最近更新 更多