2012-05-21 76 views
2

我正在寫一個名爲'run'的bash腳本,用於測試具有預定義輸入的程序。UNIX:如何使用文件作爲輸入來運行程序

它將文件作爲第一個參數,然後將程序作爲第二個參數。

調用看起來像

./run text.txt ./check 

例如,程序「運行」會跑「檢查」的text.txt與作爲輸入。這將爲我節省大量的測試時間。

現在我有

$2 <text.txt> text.created 

所以它採取的text.txt並重定向其輸入到指定的程序,這是第二個參數。然後將結果轉儲到text.created中。

我在text.txt中輸入,我知道輸出應該是什麼樣子,但是當我cat.my文件時,它是空的。

有沒有人知道用文件作爲輸入來運行程序的正確方法?這對我來說似乎很直觀,但是'check'程序可能會出現問題,而不是我在'run'腳本中所做的事情?

謝謝!任何幫助總是感激!

編輯:文件text.txt包含多行文件,每個文件都有一個輸入程序'檢查'。

也就是說,可能的text.txt含有

asdf1.txt asdf2.txt asdf3.txt

我想測試與每個文件asdf1.txt檢查,asdf2.txt,asdf3.txt 。

+0

你得到的是用'text.txt'作爲*標準輸入*來運行程序的正確方法。你確定這是程序期望的嗎? (不同的節目有不同的期望,don'tch'ya知道嗎?) – dmckee

+0

@dmckee甜!那麼text.txt包含「讓我們去」沒有引號和'檢查'期待兩個參數。奇怪的是,沒有什麼是text.created –

+0

啊...重定向文件到標準輸入強調*不*與使用文件的內容參數相同。回答按照。 – dmckee

回答

2

#!/bin/sh 

# the whole loop reads $1 line by line 
while read 
do 
    # run $2 with the contents of the file that is in the line just read 
    xargs < $REPLY $2 
done < $1 

一個簡單的測試工作正常。調用文件「運行」,並與

./run text.txt ./check 

我得到text.txt作爲參數執行的程序./check運行它。不要忘記chmod +x run使其可執行。

這是我用的是抽樣檢查程序:

#!/bin/sh 

echo "This is check with parameters $1 and $2" 

打印出給定的參數。

我的文件text.txt是:

textfile1.txt 
textfile2.txt 
textfile3.txt 
textfile4.txt 

和文件textfile1.txt,...包含每一個線對的 「檢查」 的每個實例,例如:

lets go 

one two 

輸出:

$ ./run text.txt ./check 
This is check with parameters lets and go 
This is check with parameters one and two 
This is check with parameters uno and dos 
This is check with parameters eins and zwei 
+0

謝謝!這是有用的東西,但很快的問題,如果text.txt包含其他輸入的文件名檢查?例如, asdf1.txt其中包含讓我們去 asdf2.txt其中包含一個兩個 –

+0

@ tf.rz看到我的新編輯。這有幫助嗎? – topskip

+0

是的,非常!感謝您的協助! –

2

<操作者重定向文件的內容,以該程序的標準輸入。這與將文件內容用於文件參數不同 - 這似乎是您想要的。對於做

./program $(cat file.txt) 
在bash

(或純老/bin/sh,使用

./program `cat file.txt` 

)。

這不會將多行作爲單獨的調用進行管理,您的編輯表明這是需要的。爲此,您可能會使用某種腳本語言(perl,awk,python ...),這使得文件逐行解析變得容易。

+0

'$ 2 filename.created'會起作用嗎?我通過循環運行text.txt得到了文件名。只需要餵它在檢查。 –

+0

不,'$()'是「評估內容」運算符,是評估一個字符串並在原地使用它的方式。你可能需要'./program $(cat filename)> craeted.txt'。 – dmckee

相關問題