bash文件逐行读取;同时允许交互式标准输入?

时间:2013-12-18 22:11:56

标签: bash

我认为我在这里推动了bash的限制,但我真的希望在不必重写整个脚本的情况下完成这项工作。

我有一些动态的东西,它是我要对其执行操作的文件对列表。在继续执行任何任务之前,我还想提示。

看起来像这样:

diff -rq $dir1 $dir2 | \
    sed -ne 's/^Files \(.*\) and \(.*\) differ$/\1 \2/p' | \
    while read differingfilepair; do
        ...
        printf "Continue? (Y/n)"
        read -n1 cont
    done

正如您在此处所见,while read line块似乎充当某种形式的子shell,它通过STDIN接收数据的内容。

$cont变量基本上只是覆盖了该数据的每一行的第一个字符(diff报告的文件对中第一个文件的路径中的第一个字符不同),它没有连接到终端。

有没有办法做我想在这里做的事情?我想一个解决方法是使用临时文件,但还有另一种方法吗?

编辑:使用稍后加载到while read块的临时文件,如下所示:while read l; do ...; done < .tmp_file仍然接管标准输入! (虽然我认为this answer会有所帮助)

2 个答案:

答案 0 :(得分:1)

我认为这个可能可以做到这一点:

read -n1 cont </dev/tty

Read input in bash inside a while loop

可能重复

答案 1 :(得分:1)

在bash文件中,描述符1是stdin,2是stderr,9之后可以被内部shell进程使用。 (来自bash手册页)(参见http://mywiki.wooledge.org/BashFAQ/089的例子)

Redirections using file descriptors greater than 9 should be used  with
care,  as they may conflict with file descriptors the shell uses inter‐
nally.

因此,您可以将文件读入3-9,例如(用你的文件替换echo)

for file in $(echo "file1.txt file2.txt"); do
  while IFS='' read differingfilepair <&3; do
    ...
    printf "Continue? (Y/n)"
    read -n1 cont
  done 3< "$file" #Or some command that gets file names
done