2015-05-24 18 views
2

我目前使用這兩個如果決定報表數據是否正在管道中或從文件:如何在perl腳本檢查管道數據

pod2usage("$NAME: Requires at least one argument FILE.\n") if ((-t STDIN) && (@ARGV == 0)); 
pod2usage("$NAME: zero if input is from STDIN.\n") if (!(-t STDIN) && (@ARGV != 0)); 

此工作正常時,Perl腳本運行交互式地從shell。例如,這些工作按預期:

$ perl_script <flags> filename 
$ cat | perl_script <flags> 

然而,當perl腳本由bash腳本或類似emacs中組織模式的腳本認爲它叫做是具有在管道輸送數據,並引發了pod2usage錯誤時文件是作爲參數給出的。下面是導致此行爲的一個例子:

#!/bin/bash 
while read line 
do 
perl_script <flags> $line >> output_file 
done < file_names.txt 

我猜測,這是因爲發生的事情,因爲它正在運行的非交互所以它沒有連接到終端-t STDIN是返回false。有沒有一種方法可以確保我在交互式運行腳本或從shell腳本中調用腳本時獲得正確的行爲?

+0

'即使你的腳本是不是在管道的讀端-t'返回true:'perl的 - 我們「說 「TTY」 如果-t''。要知道是否傳遞給STDIN的唯一方法是嘗試讀取它。 – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot你能舉個例子嗎? – Darwin

+1

即'while(<>){...}'。如果您沒有將文件名作爲參數或管道數據傳遞給STDIN,這將阻止並等待輸入,這正是* nix實用程序(例如'cat','awk','wc')通常會執行的操作。換句話說,我會刪除你現在的支票;您無法可靠地測試用戶是否正在向STDIN輸入某些內容(當您執行檢查時,他們可能正在輸入內容),所以請勿嘗試。相反,請執行現有程序執行的操作:允許用戶傳遞文件名作爲參數,通過管道輸入數據或通過提示手動輸入數據。 – ThisSuitIsBlackNot

回答

0

試試這個:

#!/bin/bash 
TTY=`tty` 
while read line 
do 
perl_script <flags> $line < $TTY >> output_file 
done < file_names.txt