4

我有一个主要在交互模式下使用的 bash 脚本。但是,有时我会在脚本中输入一些输入。在循环中处理标准输入后,我使用“-i”(交互式)复制文件。但是,这永远不会被执行(在管道模式下),因为(我猜)标准输入还没有被刷新。用一个例子来简化:

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

将它放在 t.sh 中,然后执行: ls | ./t.sh

不执行读取。我需要在读取之前刷新标准输入。它怎么能做到这一点?

4

2 回答 2

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"
于 2010-06-18T08:00:50.273 回答
0

我不确定是否可以在这里做你想做的事情(即read从用户而不是从用户那里获取它的输入ls)。问题是脚本的所有标准输入都是从管道中获取的。这是相同的文件描述符,因此它不会仅仅因为您想要它而“切换”到终端。

一种选择是ls作为脚本的子项运行,如下所示:

#!/bin/bash

ls | while read line
do
    echo $line
done

read -p "y/n" x
echo "got $x"
于 2010-06-18T08:07:26.183 回答