Linux 的行为略有不同如果我们在 io 重定向 '>' 之前给出 '&' 并在重定向之后给出

Linux 的行为略有不同如果我们在 io 重定向 '>' 之前给出 '&' 并在重定向之后给出

我最近在 Linux 后台启动了 jboss,发现如果运行以下命令:

nohup ./startjboss.sh > server.log &

输出为:

[1] 18835
[root@cnt5-01b downloads]#

直接出现下一个命令的终端。

但是,如果我运行以下命令:

nohup ./startjboss.sh & > server.log

那么输出是:

[1] 19223
[root@cnt5-01b downloads]# nohup: appending output to `nohup.out'

然后,当我按下回车键时,它返回到:

[root@cnt5-01b downloads]#

这是我可以写入下一个命令的终端。

为什么行为会有差异(需要额外的 Enter 键)?这是一件非常小的事情,甚至不是什么问题;但我只是想知道。

答案1

当您放置 & 时,您是在告诉 shell 在后台运行它前面的内容并继续执行新命令。

当您将其放在行尾时,后面没有命令,因此 shell 将返回到交互模式。

当您将其放在中间时,shell 会将该行的其余部分解释为一个新命令。该命令将标准输出重定向到 server.log。由于您没有重定向 nohup 的输出,因此您现在可以在终端上看到它。由于 shell 之前已经重新绘制了它的 PS1,因此您会将该行输出视为命令,但它只是来自后台作业的输出。您甚至可以在之前不按 Enter 键的情况下键入新命令(尽管稍后阅读时可能不太清楚)。

答案2

嗯,基本上,当您运行带有该命令的命令时&,您会失去一些功能。

以此为例,编写一个除了返回 2 之外不执行任何操作的脚本。

  • 正常运行脚本,发出echo $?后您将看到输出2
  • 运行脚本&,运行后echo $?你会看到输出0

另外,在运行时nohup ./startjboss.sh & > server.log,如果您检查server.log文件,您会看到它是空的,这是因为您的后台进程的输出将0成功终止,但是因为您没有将echo其放入server.log,所以实际上不会写入任何内容server.log

相关内容