- 1 名前:名無しさん@お腹いっぱい。 [2008/05/20(火) 20:58:04 ]
- シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。 まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。 □お約束 ・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。 Linuxユーザは/bin/shの正体がbashなので特に注意。 ・csh/tcshのシェルスクリプトは推奨されません。 (理由は「csh-whynot」でググれ) ・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。 manや参考リンクを見ましょう。 aproposないしはman -kでそれらしい単語による簡単な検索もできます。 ・シェルスクリプトのことをシェルってゆーな ・シェルで使えるワイルドカード等は正規表現ではありません。 正規表現の話題はスレ違い(正規表現スレへ) □初心者へのアドバイス: ・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも RubyやPerlの方が適した仕事には素直にそちらを使いましょう。 ・知らないコマンドが出てきたらmanを引きましょう。 ・思い通りに動かないときは、まずは sh -x でトレースしましょう。 シェルスクリプト総合 その10 pc11.2ch.net/test/read.cgi/unix/1202725267/
- 462 名前:名無しさん@お腹いっぱい。 [2008/07/08(火) 07:58:27 ]
- シェルスクリプトがCなどのプログラムより重い理由をうまく説明したいんですが
- 463 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 08:00:46 ]
- >>462
インタプリタ型言語だから。 (fork/execが遅いと言うだけが理由ではない。 内部コマンドだけを使ってもCよりも遅いから)
- 464 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 10:52:14 ]
- でも一番のボトルネックは fork, exec だと思うぞ
- 465 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 11:29:48 ]
- プロファイルしてみると分かるが、文字列処理も結構コストが高い。
stat(2)せずにls -lしてからパターンマッチなど。 shは文字列がグルーになっているから。
- 466 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 14:57:58 ]
- パイプとかバッククォートとかガンガン使うから、
それだけでシステムコール連発になっちゃうもんね。 文字列処理なのに write(2) とか使うわけだw
- 467 名前:名無しさん@お腹いっぱい。 [2008/07/08(火) 21:54:18 ]
- レスありがとう
ちなみにパイプでコマンドつないだ場合って一つ一つ最後まで処理して次のコマンドに移るであってますかね?
- 468 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 21:56:21 ]
- >>467
全然合ってない。それは MS-DOSのニセパイプの動作。
- 469 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 22:14:44 ]
- >>468
詳しくおしえてください・・・
- 470 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 22:21:27 ]
- >>469 シェル pipe dup2 とかで検索してみ。
- 471 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 22:50:12 ]
- そんな検索語じゃわかるわけないだろ。
pipe(2)だって無限にバッファがあって、 入口が閉じるまで出口から出て来ない仕様になってる可能性だってあるわけで。
- 472 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 23:22:32 ]
- 無限の記憶装置は存在しないのでそんな可能性はゼロだな。
- 473 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 23:25:31 ]
- MS-DOSのパイプ仕様を実装することも不可能だな。
- 474 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 23:36:10 ]
- コマンド1 | コマンド2
本来のパイプだと、 コマンド1 の標準出力 = コマンド2の標準入力 になるような操作(dupとか)が裏で行われる。 コマンド1と2は同時に実行される。一時ファイルを介さない。 嘘パイプの場合は、 コマンド1 > 一時ファイル コマンド2 < 一時ファイル 削除 一時ファイル なだけ。
- 475 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 23:57:58 ]
- 例えば
cat ばかでかいファイル | head -1 だとcatもheadも同時に起動してheadはcat の出力が1行分でたらそれを出力します そのときcatの処理が途中だったらどうなるんですか?
- 476 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/09(水) 00:11:11 ]
- やってみろよ
- 477 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/09(水) 00:50:57 ]
- >>475
バッファってしってるか?
- 478 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/09(水) 01:22:00 ]
- >>475
catがwrite(2)を呼び出したときにheadが終了している(パイプが閉じている)とSIGPIPEくらって終了。
- 479 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/09(水) 02:16:51 ]
- そのshigpipeを発行するのはパイプさん?
|

|