2010-06-18 115 views
3

我有一個bash腳本,我主要在交互模式下使用。但是,有時我會在腳本中輸入一些內容。在循環中處理stdin之後,我使用「-i」(交互式)複製文件。然而,這從來沒有得到執行(在管道模式),因爲(我猜)標準輸入沒有被刷新。與一個示例簡化:bash:沖洗標準輸入(標準輸入)

#!/bin/bash 
while read line 
do 
    echo $line 
done 
# the next line does not execute 
cp -i afile bfile 

地點這t.sh,並與執行: LS | ./t.sh

讀取未執行。 我需要在讀取之前刷新stdin。它怎麼能這樣做?

回答

6

這與沖洗無關。你的標準輸入是ls的輸出,你已經用while循環讀取了它的全部內容,所以read立即得到EOF。如果你想從終端讀取的東西,你可以試試這個:

#!/bin/bash 
while read line 
do 
    echo $line 
done 
# the next line does execute 
read -p "y/n" x < /dev/tty 
echo "got $x" 
+0

+1,但我會用$(TTY)代替的/ dev/tty設備。 – mouviciel 2010-06-18 08:06:57

+1

@mouviciel nope,$(tty)不起作用。試試吧) – unbeli 2010-06-18 08:10:33

+0

@mouviciel:爲什麼? – 2010-06-18 08:13:08

0

我不知道這是可以做到你想要的這裏(即具有read採取從用戶的輸入,而不是從ls )。問題在於全部爲腳本的標準輸入是從管道中取出的。這是相同的文件描述符,所以它不會僅僅因爲你想要而切換到終端。

一個選擇是運行ls爲腳本的孩子,像這樣:

#!/bin/bash 

ls | while read line 
do 
    echo $line 
done 

read -p "y/n" x 
echo "got $x" 
+0

不幸的是,我經常直接從命令行使用這個程序,而沒有管道輸入。在這種情況下,它可以交互式工作,就像一個shell提示我輸入命令一樣。有些時候,我通過一些過濾器將文件內容傳遞給它,或者我通過管道直接grep並sed一些內容。 – rahul 2010-06-19 05:29:49