我有一个脚本可以搜索一些文件,其中一些带有空格,因此我正在使用while read
.在这样的循环内部,我需要使用 read -p "Pause" 来等待每次交互的按键。然而,它不是等待按键,而是读取管道的第一个字母。我需要这样的东西:
find . -name "*.o3g" | grep "pattern" | while read line
do
process "$line"
read -p "Press any key to continue"
done
答案1
由于您已经在使用bash
特定代码,因此可以执行以下操作(假设 GNUgrep
或兼容):
find . -name '*.o3g' -print0 | grep -z pattern |
while IFS= read -rd '' file; do
process "$file"
read -n1 -p 'Press any key to continue' < /dev/tty
done
(其中字符(但请注意,某些键发送多个字符)是从控制终端读取的)。
或者,更好,因为这也避免process
了 的 stdin 成为来自 的管道grep
:
while IFS= read -u 3 -rd '' file; do
process "$file"
read -n1 -p 'Press any key to continue'
done 3< <(find . -name '*.o3g' -print0 | grep -z pattern)
(其中字符是从未修改的标准输入中读取的)。
也可以看看为什么循环查找的输出是不好的做法?对于处理find
输出方式的其他潜在问题。
在这里,也许你可以简单地这样做:
find . -name '*.o3g' -path '*pattern*' -ok process {} \;
另请参阅,避免除bash
其自身之外的任何 GNU 主义:
find . -name '*.o3g' -exec bash -c '
for file do
[[ $file =~ pattern ]] || continue
process "$file"
read -n1 -p "Press any key to continue"
done' bash {} +