2010-06-18 109 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