
私は文字列のすべての単語を変数に使用して割り当てsed
ます<<<
。read
私がしたことは次のとおりです。
read -a A0 <<< $(sed '2q;d' /proc/stat)
したがって、sed
ファイルの2行目を読み、file
すぐに終了します。読み取った行がsed
入力され、<<<
受信した入力が拡張され、sed
結果のread -a
値が<<<
配列要素に割り当てられます。このようにして<<<
andを使用するのはsed
良い考えですか、それとも反対の明白な理由がありますか?最も重要なのは、これを行うより速い方法がありますか?
答え1
配列割り当てを直接使用できます。
A0=($(sed '2q;d' /proc/stat))
これはワイルドカードを適用することに注意してください。コマンド出力にシェルワイルドカードが含まれている場合、ワイルドカードを含む単語は一致するファイルのリスト(存在する場合)に置き換えられます。コマンド出力に文字の1つを含めることができる場合は、\[?*
一時的にワイルドカードをオフにしてください。
set -f
A0=($(sed '2q;d' /proc/stat))
set +f
これは、以下を使用するよりも少し高速ですread
。
$ time for i in {1..1000}; do read -a A0 <<< $(sed '2q;d' /proc/stat); done
real 0m2.829s
user 0m0.220s
sys 0m0.480s
$ time for i in {1..1000}; do A0=($(sed '2q;d' /proc/stat)); done
real 0m2.388s
user 0m0.128s
sys 0m0.276s
バージョン4.0以降の場合は、bash
次のものを使用できますmapfile
。
mapfile -t < <(sed '2q;d' /proc/stat)
しかし、mapfile
最も遅いようです。
$ time for i in {1..1000}; do mapfile -t < <(sed '2q;d' /proc/stat); done
real 0m3.990s
user 0m0.104s
sys 0m0.444s
答え2
私の考えでは、構文が複雑すぎるようです。代わりに、次を使用します。
read -a A0 < <( sed '2q;d' /proc/stat )
<<< word
私は通常、他のコマンドではなく変数から入力を取得するためのコマンドが必要なときにこの構文を使用します。