web-dev-qa-db-ja.com

コマンド置換herestringを使用したBashの「while」読み取りループが入力全体を読み取らないのはなぜですか?

次の非常に基本的なBashスクリプトを見てください。

#!/bin/bash
while read l
do
  echo $l
  echo "next one"
done <<< $(ps aux)

私のコンピューターにはいくつかのプロセスがあり、ps auxコマンドはターミナルで正常に動作します。

ループでone反復のみを取得し、psコマンド出力が同じ行に表示されます。意図したとおりに機能しないのはなぜですか?

3
Bob5421

bashバージョン<4.4-betaでは、二重引用符を追加する必要があります:

#!/bin/bash
while read l
do
  echo $l
  echo "next one"
done <<< "$(ps aux)"

見る:


一般に、プロセス置換を使用する方が良いと思います。

#!/bin/bash
while read l
do
  echo $l
  echo "next one"
done < <(ps aux)

(問題を回避するために、 IFS= を使用することをお勧めします)。

またはさらに良い方法として、ファイルの読み取りに特化したプログラムを使用するか、例: awk

ps aux | awk '{print $0; print "next one"}'
7
pLumo