我尝试使用以下命令行运行示例 java 程序。但是我不知道尾部是做什么< /dev/null &
用的?
java -cp /home/weka.jar weka.classifiers.trees.J48 –t train_file >& log < /dev/null &
答案1
< /dev/null
用于立即向程序发送 EOF,使其不等待输入(/dev/null
空设备是一个特殊文件,它会丢弃写入其中的所有数据,但报告写入操作成功,并且不向其提供任何数据任何从中读取数据并立即产生 EOF 的进程)。&
是一种特殊类型的命令分隔符,用于为前面的进程提供后台。
在不知道被调用的程序的情况下,我不直接知道为什么需要以这种方式运行它。
答案2
</dev/null
断开程序的输入与终端的连接。某些程序会根据其标准输入所连接的内容做出不同的反应。使用重定向</dev/null
,程序可以判断其输入不是来自终端,并且如果尝试从其标准输入读取,则会立即收到文件结束指示。
末尾的lone&
使程序在后台执行。这意味着您会立即收到 shell 提示符。如果没有&
,只有当程序完成执行时,您才会收到 shell 提示符。
请注意,独立&
与 无关>&
。>&
是一个重定向运算符(在 tcsh、bash 和 zsh 中),它将程序的标准输出和程序的标准错误重定向到运算符后面指定的文件名(此处log
)。
换句话说,当 shell 看到这个命令行时,它会执行以下操作:
- 在后台启动一个进程。在后台进程中:
- 将标准输入连接到
/dev/null
(空设备)。 - 将标准输出和标准错误连接到调用的文件
log
(如果文件尚不存在则创建文件,如果存在则截断它)。 - 查找
java
在$PATH
. - 使用 5 个参数执行该文件:
-cp
、/home/weka.jar
、weka.classifiers.trees.J48
、–t
和train_file
。
- 将标准输入连接到