使用 std 输入和 std 输出重定向在后台运行进程

使用 std 输入和 std 输出重定向在后台运行进程

有没有办法在后台运行进程并重定向输入和输出?我有一个 java 程序,它使用 Java 扫描器,并附加了 System.in 作为输入。所以我想重定向 std 输入以从文件中读取。首先,我不确定这是否可能。以下不起作用:

$: java Bagels << in.txt &

那只是挂起。

我还想将程序的输出写入另一个文件,以供同时运行的另一个程序使用。理想情况下是这样的:

$: java Bagels << in.txt & >> out.txt &
$: python player.py << out.txt & >> in.txt &

答案1

你的第一个例子应该像这样开始

java Bagels < in.txt

正如所写,这Bagels与它的运行标准输入来自文件in.txt1。如果您要附加一个尾随&& 符号,您的程序将在后台运行,让终端的命令提示符准备好让您输入更多指令。

in.txt我认为你的第二个例子可能是这样的,但我对你的和有点困惑out.txt;通常,将一个程序的输出提供给另一个程序的输入并将第二个程序的输出作为第一个程序的输入并不是一个好主意。

java Bagels < in.txt | player.py > out.txt

其作用是附加in.txt标准输入Java 程序(<来自文件),附加其标准输出输出到标准输入输入player.py,并写入标准输出Python 程序的输出到文件out.txt>TO 以只写模式截断的文件,替换为>>追加,或1<>以读+写模式打开而不截断)。

最后,回答你在第一句话中写的问题“有没有办法在后台运行进程并重定向输入和输出?“,你可以像这样把它们放在一起

java Bagels < in.txt > out.txt &

¹ 此处以只读模式打开,替换为<>0<>ksh93 以以读+写模式打开,尽管实际上需要以读+写模式打开 stdin 的情况极为罕见

答案2

为了简单起见,我将给出一个使用“cat”命令的示例(“cat”只是读取输入并将其写入)当您输入“cat < input”时,cat 命令将从文件“input”中获取输入。但是,如果您键入“cat << end_of_input”,则处于(此处文档)状态,这意味着您的 shell 将读取您键入的所有输入行(从键盘),直到您写入行“end_of_input” “(大多数情况下 ctrl_d 也可以工作),然后将使用您提供的输入执行该 cat 命令(当然不包括 end_of_input 行),这就是它挂起的原因,因为它正在等待您键入输入

在此输入图像描述

至于重定向标准输入,您只需要编写“command < input_file”即可将命令的输出重定向到文件,您有两种选择:

1-“cmd > output”(注意只有一个“>”),在这种情况下,如果名称为“output”的文件已经存在,它将被命令的输出覆盖。

2-“cmd>>output”(注意两个“>>”):如果文件“output”存在,则将命令的输出附加到它。至于如何使命令从前一个命令的输出中获取输入,您可能需要使用“管道”

举一个简单的例子:“ls | cat”,这会将命令“ls”的输出重定向到命令“cat”的输入。 (如果进程可以在后台运行,那么进程在后台运行这一事实就无关紧要了。)

希望这有帮助,祝你好运。

相关内容