`<&-` 有什么作用?

Eri*_*cis 20 shell bash io-redirection

我复制了一段 Bash 到后台远程执行的 ssh 命令:

ssh user@remote <<CMD
some process <&- >log 2>error &
CMD
Run Code Online (Sandbox Code Playgroud)

有什么作用<&-
我的猜测是它与< /dev/null

我的下一个理解是需要关闭三个主要文件描述符(stdin, stdout, stderr)以防止:

  1. 正在后台运行的工作和退出的脚本 - 以某种方式发生冲突?
  2. 当终端关闭时,所有从终端接受 stdin 的进程都关闭了吗?

Tom*_*unt 30

<&-是不是一样的东西< /dev/null<&-关闭 fd 0,而< /dev/null从设备重定向它/dev/null,它从不提供任何数据并且总是在读取时提供 EOF。不同之处主要在于read(2)来自关闭的 FD(<&-案例)的调用将使用 EBADF 出错,而来自空重定向的 FD 的调用将不返回读取的字节(文件结束条件)。如果您的程序从不从 stdin 读取,则区别无关紧要。

如果您正在后台处理某些内容,关闭 FD 是一种很好的做法,因为如果后台进程尝试从 TTY 读取任何内容,它就会挂起。然而,这个例子并没有完全处理它应该做的一切;理想情况下,在某处会有一个nohuporsetsid调用,以完全分离后台进程。

  • 最彻底的方法(模仿程序守护进程的方式)类似于`setsid some process &lt;&amp;- &gt;path/to/log 2&gt;path/to/error`。更快的方法是类似于`nohup some process &amp;`。 (2认同)
  • @EricFrancis:在这里使用 `nohup` 毫无意义。`nohup` 阻止进程在其控制终端关闭时接收 `HUP` 信号。但是在这种情况下你没有任何终端。 (2认同)
  • 关闭 fds 0、1 和 2 不是一个好主意……您不希望创建的下一个 fd 占用这些值之一。最好将它们重定向到 /dev/null (2认同)

cho*_*oba 7

man bash

  [n]<&word
Run Code Online (Sandbox Code Playgroud)

用于复制输入文件描述符。如果word扩展为一个或多个数字,则由 表示的文件描述符n将成为该文件描述符的副本。如果 中的数字 word 未指定为输入打开的文件描述符,则会发生重定向错误。如果 word 的计算结果为-n则关闭文件描述符。如果n未指定,则使用标准输入(文件描述符 0)。


cuo*_*glm 7

<&- 关闭标准输入。

POSIX 定义一般形式是:

[n]<&word
Run Code Online (Sandbox Code Playgroud)

其制作文件描述符的目的n是由word. 假设标准如果n被省略,如果word-,文件描述符n将被关闭。

它与 不同</dev/null,因为在 的情况下</dev/null,标准输入仍然打开,并被重定向到其他地方。

您需要关闭所有附加到 ssh 套接字的进程的文件描述符,否则无法关闭 ssh 会话。

您可以使用screentmux在远程机器上运行该命令,而无需将其附加到 ssh 会话:

ssh user@remote 'screen -S test -d -m command'
Run Code Online (Sandbox Code Playgroud)