2013-01-07 230 views
1

此問題的關鍵值與使用破折號「 - 」重定向stdin流有關。破折號重定向從標準輸入到標準輸出

我有下面的代碼中基本的測試腳本:

#!/bin/bash 
# This causes the shell to await user input. 
file - 
# Need to emulate user input here... 

哪個殼的一個命令可以模擬用戶輸入在這種情況下?

謝謝。

+0

檢查這個帖子http://stackoverflow.com/questions/2746553/bash-script-read-values-from-stdin-pipe 我認爲它包括你的問題的答案 – weberik

+0

你問'bash'爲在問題標題中是shebang還是'dash'? –

+0

無論如何,它們在這個特定的方面是兼容的;但是你應該一般詢問關於Bourne'sh'和兼容的東西。 – tripleee

回答

1

流水線cmd1 | cmd2根據定義連接標準輸出文件描述符cmd1作爲cmd2的標準輸入文件描述符。

echo foo | file - 

這個特殊的例子很難用; file命令對於在流水線中使用的那種短暫數據運行沒有多大意義。一個更有用的例子是在文件上運行file。如果你確實希望這個文件是標準輸入,那麼簡單的輸入重定向就可以做到這一點。

file - </path/to/example/file 

或者,你可能會尋找這樣的:

file $(locate example/file) 

其中locate是打印到您可能需要爲實際輸入參數file的文件的完整路徑的命令的例子。

+0

非常感謝。你的兩個答案都很有幫助。這是我正在尋找的。 –

1

你可能需要一個here document

#!/bin/bash 
# This causes the shell to await user input. 
file - <<'EOF' 
This is what the user 
might have typed 
if it wasn't in a here document. 
${BASH:=head} $(ls | wc -l) 
EOF 

here文檔持續到只包含標記字線。 在該示例中,標記字是EOF;你可以選擇你喜歡的任何名字(經常使用!)。標記詞周圍的引號意味着在這個文檔中不會執行shell擴展,所以shell的最後一行不會被擴展。如果缺少引號(如<<EOF),則會發生shell擴展。這在您需要時很有用。

+0

謝謝你的回答。瞭解輸入能力對我非常有幫助。 –