読むときは、内部のキーボードキーを読んでください。

読むときは、内部のキーボードキーを読んでください。

一部のファイルを検索するスクリプトがあり、その一部には空白があるため、を使用しています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

(ここでは文字(ただし、いくつかのキーは複数の文字を送信します)は制御端末から読み取られます。

あるいは、より良い方法は、次にprocessstdinがパイプされるのを防ぐためです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 {} +

おすすめ記事