- 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/
- 452 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 11:13:09 ]
- FreeBSD 付属の wc は空白文字でパディングして結果を返すようです。
wc -l $file | sed "s/ /_/g" _____340_/usr/bin/g++ Linux では次のようにして 340 という値を得ていたのですが、 FreeBSD では空白文字が出力されてしまいます。 wc -l $file | cut -f1 -d" " FreeBSD 版 wc ではどうすればいいでしょう。 ltrim() みたいなものがありますかね。 それともいったん sh の変数に代入する? それとも wc や cut には未知のオプションがある? cut なんていう頑ななコマンドは使わないで、 sed 's/^ *\([0-9]*\) .*$/\1/' しろ? お前 awk '{ print $1 }' も書けないのか? bash をよく使うので、依存しているところがあったらごめんなさい。 awk はほとんど馴染みがありません。というか、 何かにつけて不遇の cut を使ってあげたい気持ちがあります…。
- 453 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 11:15:19 ]
- >>452
echo `wc -l < $file`
- 454 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 11:28:33 ]
- >>452
長文で cutを力説してるのに、 >>453 で cutすら必要ないというオチにワロタ wc で、引数じゃなくて標準入力の場合はもともとファイル名が出ないので cutとかで切る必要ないのと、スペースを取り除くにはシェルの ` ` を使うってことね。
- 455 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 11:33:53 ]
- > それともいったん sh の変数に代入する?
質問者が用意した選択肢を誇らしげに答える>>453-454が憐れ。
- 456 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 11:38:03 ]
- 空白文字のパディング方式に、
暗黙の仮定を置いてまでcutにこだわる意味が全くわからん。 仕様の特殊化しても嬉しくない。
- 457 名前:452 mailto:sage [2008/07/04(金) 11:38:04 ]
- いやいや
> wc で、引数じゃなくて標準入力の場合はもともとファイル名が出ないので 役に立ちました! 確かに笑った。
- 458 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 11:38:44 ]
- >>455
おまえ、シェルスクリプト書いたことないだろ? >>453 では一切「sh の変数に代入」は行なっていないがww
- 459 名前:452 mailto:sage [2008/07/04(金) 11:50:48 ]
- >>456
いやいや、そうなんですよ。 cut ってつまり結局 他のコマンドと組み合わせるには中途半端なツールなんですよ。 単純でそれなりに覚えやすく、見込みのあるヤツだと思ってたんですが… awk や bash は区切り文字を変えるだけでも結構タイプする印象が。 いや、変にこだわってごめんなさい。
- 460 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 12:06:44 ]
- つ awk -F:
- 461 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 15:50:34 ]
- cut はデリミタの連続を指定できれば使える君に化けるんだがな。
- 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を発行するのはパイプさん?
|

|