2013-12-18 47 views
0

我想我在这里推动了bash的限制,但是我真的想要完成这个工作而不必重新编写整个脚本。bash文件逐行读取;同时允许交互式stdin?

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

它看起来像这样:

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的。

$cont变量基本上只是吸食该数据的每一行的第一个字符(在该对中diff报道为不同的文件的第一文件的路径中的第一个字符),它不连接到该终端。

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

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

+0

是的,似乎是这个问题的文件描述符重定向方法的等式的一部分...虽然这是有点超越我。我最终利用了数据的结构性,并通过简化列表并使内部循环跟踪状态。在'cat file'中使用'for file''' –

回答

1

在bash文件描述符1是标准输入可能重复,2是标准错误,并且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例如(取代回声,但你正在获取文件)

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 
+0

非常好。你还可以注意到如何使用不同的文件描述符来将东西输入到'while'中? –

+1

完美的答案。唯一的批评是,TLDP可能不是最好的参考点,因为它往往是过时的或不准确的。 http://mywiki.wooledge.org/BashFAQ/089是另一个直接指向的参考。 –

+0

@Steven Lu你需要管它吗?当我第二次尝试时得到一个错误的文件描述符警告。我相信有一些神奇的方式来获得它,但可能更容易顺序重定向他们。 – BroSlow