シェルのループ内で標準入力を受け付けるコマンドを書くと?
#シェル芸 これは一体何が起きているのか?解説出来る方求む・・・ $ seq 1 10 | while read n; do awk '{print $1}'; done 2 3 4 5 6 7 8 9 10
2017-12-15 19:09:32@nogiro_iota whileループ内に標準入力から入力待ちになるコマンドを書くとかやった事は無かったので、正直この動きは分かりにくいです・・・
2017-12-15 23:35:09@papiron 試しに $ seq 1 10 | while read n; do sed -n p; done をやってみましたが、この場合でも1は出力されませんでした… awkやsed側の問題と言うより、while構文の動作で何かが起きている感じですね
2017-12-15 19:24:20@gin_135 他の方の指摘にもありましたが、whileでの読み込みは1回だけで後はsedが入力を食ってしまってるみたいですね。これ分かりにくいですわ・・・set -xしてみたら何となく分かりました。
2017-12-15 23:32:25% seq 10 | (head -1; cat) でcatされないのはheadでバッファリングされるのでそこで全部読み込まれてしまうため。 2000ぐらい送れば出てくる seq 2000 | (head -1; wc -l) #シェル芸
2017-12-16 15:43:36@papiron 例えばこんな事をしてみたり $ df -h | { read h; echo "$h"; sort -k3,3hr; }
2017-12-15 19:25:351はreadが読んで、2から10はawkが読んで、もう全部読んだのでwhileが終了したということかな twitter.com/papiron/status…
2017-12-15 19:36:04$ seq 1 10 | while read n; do echo "$n foo"; awk '{print $1}'; echo "$n bar"; done 1 foo 2 3 4 5 6 7 8 9 10 1 bar あってたっぽい
2017-12-15 19:42:06@papiron bashでは同一サブプロセスではクローズされていない標準入力が次のコマンドに引き継がれるので、readで1行だけ読み(そして変数nは放置されているので出ず)、後のawkが続きすべて読んで2以降をprintしていると思います。seq 1 100 | (head;tail) なんかと同パターンですね。
2017-12-15 22:12:31問題です。以下は何故こうなるでしょうか? #シェル芸 $ seq 10 |(sed '3q'; grep 9) 1 2 3 $ seq 10 |(read v; echo $v; read v; echo $v; read v; echo $v; grep 9) 1 2 3 9 $ seq 10 >seq-10.txt $ cat seq-10.txt |(sed '3q'; grep 9) 1 2 3 (sed '3q'; grep 9) <seq-10.txt 1 2 3 9 twitter.com/papiron/status…
2017-12-23 20:28:37「シェルのループ内で標準入力を受け付けるコマンドを書くと?」をトゥギャりました。 togetter.com/li/1182814
2017-12-23 20:10:07Solaris 10 だとこうなるわー。#シェル芸 $ (/bin/sed '3q'; grep 9) <seq-10.txt 1 2 3 $ (/usr/xpg4/bin/sed '3q'; grep 9) <seq-10.txt 1 2 3 9
2017-12-23 20:31:44