2012-12-09 445 views
0

我想將此awk輸出重定向到文件句柄,但沒有運氣。將多重輸出重定向到perl中的文件句柄

代碼:

open INPUT,"awk -F: '{print $1}'/etc/passwd| xargs -n 1 passwd -s | grep user"; 
while (my $input=<INPUT>) 

{ 
...rest of the code 
} 

錯誤:

Use of uninitialized value in concatenation (.) or string at ./test line 12. 
readline() on closed filehandle INPUT at ./test line 13. 

回答

0

看起來你已經通過正在Perl中尋找您還沒有定義的變量$1字符串中$1。嘗試通過在其前面放置\來逃避字符串中的$

由於字符串無效,它不會執行打開,然後產生第二個錯誤。

+1

的字符串是完全合法的。輸出不能通過文件句柄檢索是由於字符串末尾沒有「|」。 –

+0

該字符串無效,因爲它沒有正確地形成,因爲他沒有逃過$,因此不是他認爲是的字符串。你對錯過的'|'是正確的。 –

+0

從Perl和awk的角度來看,該字符串在語法上是正確的。不是有效的,也不是做某人想要他們做的是兩件完全不同的事情。 –

4

顯示的錯誤信息與主題中的問題沒有直接關係。

  1. 爲了打開一個管道和檢索你必須添加「|」在open通話的最後結果在Perl。
  2. 錯誤消息來自Perl解釋您在該雙引號字符串中使用的$1。但是,您的意圖是將該逐字傳遞給awk。因此,您必須在的Perl端轉義$
  3. /etc/passwd參數前面沒有空格。

摘要:這應該更好的工作:

open INPUT,"awk -F: '{print \$1}' /etc/passwd| xargs -n 1 passwd -s | grep user|"; 

不過,您也應該檢查錯誤等

+0

Thanks Mortiz。這樣可行。 :)一旦我在一個班輪的末尾添加了管道,它就起作用了。我對文件句柄 有一些疑問1.當我在「open」中添加「<」作爲第二個參數時,它不起作用。爲什麼這樣? 2.在/ etc/passwd仍然有效之後,我沒有刪除空格。空間在File Handles中扮演着重要角色嗎? 3.我對這個轉義\ $ 1有點困惑。就好像我嘗試'awk -F:'{print \ $ 1}'/ etc/passwd'從shell awk程序中拋出一個錯誤,但是它在perl內部時是如何工作的? – chidori

+0

1.'<'打開一個文件,而不是一個進程/管道。 2.如果沒有空格,那麼awk將'/ etc/passwd'視爲要執行的代碼的一部分,而不是作爲要讀取的文件名。 3. Perl會看到'\'並且不知道專門處理下一個字符'$'。所以Perl刪除那個'\',但保留'$ 1'逐字,'awk'只看到字符串'print $ 1'。 –

+0

您可以使用'|'寫入進程,使用' - |'從(open)的(首選)3參數形式的進程中讀取數據。有關詳細信息,請參閱[打開](http://perldoc.perl.org/functions/open.html)。 –