Bash

如何使用管道將文本應用於程序

  • February 6, 2017

我的導師說要使用管道將包含測試案例列表的文本文件應用於從輸入文件中獲取測試案例的工作程序。說我有

test_cases.txt
my_program //my java program after compliation

當我這樣做時

java my_program | test_cases.txt

它給

[1]+ Stopped               java my_program | test_cases.txt

不知道如何使用管道…

首先,管道連接兩個程序,而不是文件(包括文本文件),這樣一個程序的輸出就會進入另一個程序的輸入。假設是“生成”輸出的程序將其發送到STDOUT,它成為管道的源,而“接收”輸入的程序從 讀取它STDIN,它成為管道的目的地。您不能將管道連接到文本文件或任何其他文件,只能連接到程序。

其次,當使用管道時,管道左側的程序是使用STDOUT的,管道右側的程序使用STDIN。因此,您嘗試的命令將嘗試將輸出發送到my_program管道,而不是從中讀取。

如果你正確地展示了你得到的指示,那麼它無論如何都無法工作。指令以“……一個工作程序從輸入文件中獲取測試案例”結尾。如果程序從文件中獲取輸入,那麼它不會從 讀取STDIN,並且無論如何都會忽略管道中的數據。

為了使它與管道一起工作,my_program必須編寫從 讀取STDIN,就像期望您在提示符下手動鍵入測試案例一樣。然後你可以將命令行重寫為

cat text_cases.txt | jave my_program

cat是一個程序,它將讀取文本文件並將其內容髮送到STDOUT,然後my_program將使用管道“讀取”數據,STDIN而不是手動輸入數據​​。由於我不知道 java 是如何與管道連接的,這是基於它將以標準方式執行的假設,因為講師要求您使用該方法。

恕我直言,使用重定向比使用管道更好,因為使用更少的資源。

java my_program < test_cases.txt

也就是說,除非這是一個將包含在更大的流程鏈中的一個步驟,稍後在使用管道的過程中將變得有必要。

引用自:https://unix.stackexchange.com/questions/342787