回答この質問は、私は別の質問をさせて:
私は、次のスクリプトは、同じことを行う2つ目は、最初のものを使用しているため、はるかに高速であるべきと思ったcat
何度もファイルを開く必要がなく、二つだけのファイルを開きます一度だけ変数をエコーします:
(正しいコードについては、更新セクションを参照してください。)
最初:
#!/bin/sh
for j in seq 10; do
cat input
done >> output
第二:
#!/bin/sh
i=`cat input`
for j in seq 10; do
echo $i
done >> output
入力は約50メガバイトです。
しかし、2番目の方法を試したときは、変数のエコーi
が大規模なプロセスだったため、遅すぎました。また、2番目のスクリプトで問題が発生しました。たとえば、出力ファイルのサイズが予想よりも小さかったです。
私はまたのmanページを確認echo
し、cat
それらを比較します:
echo-テキストの行を表示します
cat-ファイルを連結し、標準出力に出力します
しかし、違いはありませんでした。
そう:
- なぜ2番目のスクリプトでcatがとても速く、エコーがとても遅いのですか?
- それとも変数の問題です
i
か?(そのマニュアルページでecho
は「テキスト行」と表示されると言われているので、i
。のような非常に長い変数ではなく、短い変数に対してのみ最適化されていると思います。しかし、それは単なる推測です。) - そして、使用するときに問題が発生したのはなぜ
echo
ですか?
更新
間違って使用するseq 10
代わりに使用しました`seq 10`
。これは編集されたコードです:
最初:
#!/bin/sh
for j in `seq 10`; do
cat input
done >> output
第二:
#!/bin/sh
i=`cat input`
for j in `seq 10`; do
echo $i
done >> output
ただし、問題のポイントではありません。ループは一度だけ発生した場合でも、私は同じ問題を得る:cat
はるかに速くよりも動作しますecho
。
echo
高速です。不足しているのは、変数を使用するときに引用符を付けないことにより、シェルにあまりにも多くの作業をさせているということです。
printf '%s' "$i"
、ではありませんecho $i
。@cuonglmは、エコーの問題のいくつかを彼の答えでうまく説明しています。エコーを使用する場合に引用でさえ十分ではない理由については、unix.stackexchange.com
cat $(for i in $(seq 1 10); do echo "input"; done) >> output
?:)