我认为我在这里推动了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会有所帮助)
答案 0 :(得分:1)
答案 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