2014-12-20 55 views
4

我正在通過管道(stdin)輸入腳本,如(other_command | my_script)中所述。但是,我需要暫停腳本並等待用戶在閱讀完整個stdin之後按Enter鍵。在讀取(stdin)循環後暫停bash腳本

這是一個示例腳本。

#!/bin/bash 

if [[ -t 0 ]]; then 
    echo "No stdin" 
else 
    echo "Got stdin" 
    while read input; do 
    echo $input 
    done 
fi 

echo "Press enter to exit" 
read 

它的工作原理是這樣的;

$ echo text | ./script 
Got stdin 
text 
Press enter to exit 
$ 

它跳過我最後的read

但是;

$ ./script 
No stdin 
Press enter to exit 
stops here 
$ 

我怎樣才能獲得read到我從標準輸入讀取後工作?那麼是否有可以在Linux和OSX上運行的解決方案?

回答

4

您想要從用戶那裏讀取。如果stdin不是用戶,你必須從其他地方讀取。典型的選擇是當前終端(這裏的終端連接到stderr,假設有一個終端)。

read -p "Press enter" < "$(tty 0>&2)" 

默認情況下tty發現讀取標準TTY,這是標準輸入管道時顯然是行不通的名稱。因此,我們重定向,而不是看stderr。

+0

好處,但是,'tty' sais'不是一個tty'如果這樣跑。 '/ dev/ttys006',否則。因此,'read <「/ dev/ttys006」'起作用,但不可行。 – xeor

+0

你確定你沒有錯過任何地方的命令? '「$(tty)」'簡單地說**執行'tty'並提供引用的結果。 'tty'會返回類似'/ dev/ttys006'(取決於系統/終端)。所以''$(tty)「''應該完全''/ dev/ttys006''在你的終端執行以下命令來檢查'(mytty =」$(tty)「; echo」tty:$ mytty「)' –

+0

'回聲「tty」>測試; sh test;回聲字符串| sh test'用'/ dev/ttys006'顯示一行,用'not a tty'顯示一行。發生在我的OSX和Linux測試中。 – xeor