1 名前:名無しさん@お腹いっぱい。 [2009/07/01(水) 09:42:48 ] シェルスクリプトの総合スレです。 スクリプトのお勉強・自慢・腕試しなどにどうぞ。 まずは注意点、リンク、地鎮祭など(>>1-6 くらい)をご覧ください。 □お約束 ・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。 Linuxユーザは/bin/shの正体がbashなので特に注意。 FreeBSDユーザは/bin/shの正体がashなので注意。 v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。 src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sh/ heirloom.sourceforge.net/sh.html ・csh/tcshのシェルスクリプトは推奨されません。 (理由は「csh-whynot」でググれ) ・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。 manや参考リンクを見ましょう。 aproposないしはman -kでそれらしい単語による簡単な検索もできます。 ・シェルスクリプトのことをシェルってゆーな ・シェルで使えるワイルドカード等は正規表現ではありません。 正規表現の話題はスレ違い(正規表現スレへ) □初心者へのアドバイス: ・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも RubyやPerlの方が適した仕事には素直にそちらを使いましょう。 ・知らないコマンドが出てきたらmanを引きましょう。 ・思い通りに動かないときは、まずは sh -x でトレースしましょう。 前スレ シェルスクリプト総合 その14 pc12.2ch.net/test/read.cgi/unix/1233179688/
445 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/12(土) 11:33:12 ] いいかげんバカは放置しようよ
446 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/12(土) 11:35:59 ] >>444 いや、>>360 が、「器量」を「懐」あたりの意味と取り違えていて、 「器量」にはその意味しかないと思い込んでいると思われたので、 その反例として>>368 で「器量」の意味のひとつを挙げた。 反例にはなっている。
447 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/12(土) 11:39:42 ] >>446 お前が基地害だというのは充分判ったから もういいだろ。どう足掻いてもお前に勝ち目は無いよ
448 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/12(土) 11:43:59 ] >>363 が責任を取って氏ねば解決
449 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/12(土) 11:44:00 ] >>447 はためから見ると負けてるのは >>447 の方だがw
450 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/12(土) 11:47:25 ] 「器量が狭い」を認められない器量の狭さワロス
451 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/12(土) 11:48:59 ] >>450 そういうのは「懐が狭い」って言うんだよ。覚えとけ。
452 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/12(土) 11:49:33 ] >>445 >>439 のような馬鹿は半端に叩くと粘着するから。「器量」を見ただけでPTSD起こす くらいまで叩いて置かないといけない。 >>446 なってねーよ。馬鹿。たった、「1レスくらいどうってことないだろ。器量が狭いな」だけの 発言から > 「器量」にはその意味しかないと思い込んでいると思われたので、 このように思うって、お前が馬鹿であるという証明にしかならない。 しかも、*無い*事を示すために他の例を挙げれば済むとか。 どんだけ低脳なんだよ。惨め惨め惨めの三重奏だぜ。
453 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/12(土) 11:51:05 ] >>451 懐は深い/浅いだよ。覚えとけ。
454 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/12(土) 11:53:51 ] >>451 恥の上塗り乙
455 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/12(土) 11:55:06 ] >>453 あほか、 懐が深い/浅いだと意味が違う。反例になってない。
456 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/12(土) 11:58:14 ] >>455 更に恥の上塗り乙
457 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/12(土) 12:02:24 ] 一般的に、>>454 >>456 みたいに「恥の上塗り」とかだけ書いて 具体的な反論を書かなくなった方が議論の負けなんだよ。
458 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/12(土) 12:04:25 ] >>457 そのルールだとファビョったほうの勝ちか? お前のように(笑)
459 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/12(土) 12:20:17 ] まだ続くのか日本語講座
460 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/12(土) 13:19:30 ] 自作自演飽きた。
461 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/12(土) 13:47:48 ] 自演だと思うのは自分が自演してるからだ。
462 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/12(土) 13:56:20 ] 全部おれの自演でした
463 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/12(土) 13:59:07 ] >>457 が吊れば平和 とっとと逝け
464 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/12(土) 14:12:22 ] >>438 Solarisの/bin/shだとファイルリダイレクトでもサブシェルになる。
465 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/12(土) 14:22:06 ] >>464 「サブシェルになる」ことをどうやって確認した? まさか、while read AAA の、ループを抜けた時、 AAAの内容が空になるのを見て「サブシェルだ」と思ってないだろな。 readは最後に EOF を読み込んで while を抜けるから、 ループを抜けた時 AAA は空になるが、サブシェルではない。 while read AAA do BBB=$AAA done < file echo $BBB で試してみろ。
466 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/12(土) 14:22:49 ] SunOS4 当時の /bin/sh はどう振舞うの?
467 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/12(土) 14:34:53 ] >>465 試したけど Solarisの /bin/shだとやっぱりサブシェルだよ。
468 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/12(土) 23:49:07 ] 自信満々でダウトしといて外してるって恥ずかしくない? どんな気持ち? >>363 とか>>363 とか>>363 とか>>363 とか>>438
469 名前:名無しさん@お腹いっぱい。 [2009/09/13(日) 01:00:33 ] シェルスクリプトの実行者に対しy/n等で確認を求めたい場合 通常readで止めて入力を促しているのですが while read のループの中でそれをやろうとすると上手くいきません。 while read 〜 echo "Y or N" read YESNO ←ここで止まってくれない 〜判定処理〜 done < fileHoge whileのreadと入力要求のreadが干渉しているのが原因のように思っています。 よい方法はありますでしょうか? (ddやselectなども試しましたがダメでした)
470 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/13(日) 01:03:39 ] read YESNO < /dev/tty かな?
471 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/13(日) 01:08:19 ] ありがとう それやってみます!
472 名前:名無しさん@お腹いっぱい。 [2009/09/13(日) 17:59:13 ] よく commandA | tee LOGFILE などのやり方で表示しつつログをとる事があると思いますが commandAの終了ステータスを判断したい時、この場合だと$?がteeの結果になり commandAの終了ステータスが分りません bashなら環境変数${PIPESTATUS[パイプライン中のコマンド位置]} で取れることを調べられたのですが、あいにく改造母体のファイルはkshなんです。 よい方法はありますでしょうか?
473 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/13(日) 18:04:42 ] >>472 ((commandA; echo $? 1>&3) | tee LOGFILE ) 3>&1
474 名前:472 mailto:sage [2009/09/13(日) 18:22:57 ] >>473 ありがとうございます! 明日試してみます!
475 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/13(日) 19:39:39 ] >>473 この書き方すぐ忘れるんで、そんな時はcsh-whynotでググるんだ
476 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/13(日) 20:03:38 ] csh(笑)
477 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/13(日) 21:17:24 ] csh-whynotを知らずにcshを笑うとは… 爆笑だぜ。
478 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/14(月) 08:13:40 ] ここだけ20世紀
479 名前:名無しさん@お腹いっぱい。 [2009/09/20(日) 15:13:01 ] コマンドの引数に別のコマンド実行結果を利用する時 commandA `commandB` とやりますが、さらにその実行結果をコマンドの引数に利用したい場合、 変数にcommandA `commandB`を入れてcommandC $変数 などとやってるのですが、 変数を使わずに出来る手法はありますでしょうか。 イメージ的には「commandC `commandA `commandB``」みたいな感じ。
480 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/20(日) 15:17:56 ] commandC $(commandA $(commandB)) 純正シェルの人は苦行に耐えて頑張ってください。
481 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/20(日) 15:34:01 ] commandC `commandA ¥`commandB¥``
482 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/20(日) 15:40:06 ] >>480-481 ありがとう!試してみます!
483 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/20(日) 18:46:17 ] あるフォルダの中の*.cというファイルを~/srcというフォルダにコピーするにはどうすればいいですかね?
484 名前:名無しさん@お腹いっぱい。 [2009/09/20(日) 18:47:47 ] スクリプト使わない質問はスレ違い
485 名前:483 mailto:sage [2009/09/20(日) 18:49:13 ] 申し訳ありませんでした。。
486 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/20(日) 18:56:39 ] cp *.c ~/src/
487 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/20(日) 19:01:09 ] >>486 説明不足でした。。 いくつかの階層に分かれていたのでできなかったのです。 情報後出しとか氏んどけって話ですよね。。 mv `find -name *.c` ~/src/ 上のレスみて何とかなりました もう本当にスレ汚し失礼しました。
488 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/20(日) 19:01:22 ] >>486 やってみましたが、どうもホームフォルダの下の/srcにコピーされるようです。 ?/srcというフォルダにコピーしたいんですが。
489 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/20(日) 19:14:59 ] >>487 それだと同じ名前ぶつかってると上書きされるぞ。
490 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/20(日) 20:11:24 ] スクリプトの中で使う場合って~と$HOMEってどっちが一般的なんですか?
491 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/20(日) 20:25:00 ] もちろん $HOME チルダは純正では使えない
492 名前:名無しさん@お腹いっぱい。 [2009/09/20(日) 20:46:49 ] bash又はkshで長さが一定でないファイル名からある位置の文字を取り出したい。 具体的にはhogehoge〜XX.txtのXXの2文字。後ろから5,6文字目。 前からの位置であればcutで簡単だったのだが後ろからで行き詰った。 考えた挙句、echo ファイル名 | wc -c等で長さを取って、 それをexprで6減算した値をcutの開始位置にしてやったりして出来たのだが たかが2文字取り出すだけなのにスマートじゃない。 もっとシンプルに行かないものでしょうか?
493 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/20(日) 21:00:31 ] >>492 expr 'hogehoge〜XX.txt' : '.*¥(..¥).txt'
494 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/20(日) 21:16:12 ] >>493 ありがとう今度やってみます でもちょっと難しくて今時点でなんで期待の結果が得れるか把握しきれてないです。 exprのそういった使い方を勉強します。
495 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/20(日) 23:18:27 ] revは環境依存?
496 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/21(月) 10:57:39 ] >>492 fにファイル名が入っているとして a=${f#${f%??.txt}} echo ${a%.txt} ではどうか。
497 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/21(月) 13:03:33 ] bashでいいなら、 ↓で一発じゃん (fileにファイル名が入っているとして) echo ${file:$((${#file}-6)):2}
498 名前:名無しさん@お腹いっぱい。 [2009/09/21(月) 14:38:10 ] 対話的なスクリプトが二つあって それをスクリプト同士対話させたいのですが どのように相手の出力をもう片方の入力につなげるのでしょうか?
499 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/21(月) 14:40:43 ] >>498 fifo
500 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/21(月) 14:46:33 ] >>5 > シェルの対話的な利用についての話やスクリプトと関係ないコマンドの > 使い方の質問などはスレ違いなので無用に願います。
501 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/21(月) 15:07:30 ] >>498 双頭バイブ
502 名前:492 [2009/09/26(土) 20:45:00 ] >>493 >>496 >>497 全て上手くできました。 ありがとう。 >>493 のやつはshでもOKですね。
503 名前:名無しさん@お腹いっぱい。 [2009/09/27(日) 00:28:00 ] スクリプトの中で他ユーザにしか実行権の無い別のスクリプトを実行するため、 su - USER -c COMMAND としたいのですが、パスワードを求められます。 今時点ではパスワード入力をスクリプトの実行者に入力させてますが このパスワード入力をスクリプトの中で自動で出来る方法はありますか? ご教授お願いします。
504 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/27(日) 01:43:06 ] >>503 sudoかexpect
505 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/28(月) 01:37:41 ] バッククォートで実行するコマンドの標準出力と標準エラーをそれぞれ 別の変数に入れることってできますか? やりたいことは以下と等価なんだけど、一時ファイルを作らずにやりたいんです。 stdout=`command 2>stderr.tmp` stderr=`cat stderr.tmp`
506 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/28(月) 23:10:05 ] >>504 すみません、Solarisなので両方とも使えませんでした。
507 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/29(火) 00:48:13 ] Solaris なら pfexec を使うのかな www.itmedia.co.jp/enterprise/articles/0710/24/news027_2.html
508 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/29(火) 21:59:35 ] >>506 Solarisでsudoもexpectも使えないなんてことを書いてしまうとは・・・ ろくに調べもしないでコマンド入れ替えただけとしか思えん。
509 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/29(火) 22:17:54 ] 混ぜ物を一切していない純血Solaris
510 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/01(木) 21:34:47 ] あるコマンドの標準出力を一行ずつ見ていって、それがある正規表現Xにマッチしてたら コマンドAの標準入力にいれて、その標準出力を取得、それ以外なら、コマンドBの 標準入力に入れて、その標準出力を取得、その2つの標準出力を、標準入力の 順番と同じ順番でそろえて出力を得たいのですが、方法はありますでしょうか? わかる方いたら教えていただけませんでしょうか。よろしくお願いいたします。。。
511 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/01(木) 22:00:58 ] >>510 #!/bin/sh while IFS= read line do if echo "$line" | grep -q XXX then a=`echo "$line" | command_A` echo "$a" else a=`echo "$line" | command_B` echo "$a" fi done
512 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/01(木) 22:40:13 ] >>511 ありがとうございます。 でもこれだと、command_A、command_Bは毎入力行ごとに起動しなおすことに なりませんでしょうか。 command_A, command_Bともに入力に応じて、内部で状態が変化するので、 ずっと起動しっぱなしにしたいのですが、そういうことはできますか?
513 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/01(木) 22:43:20 ] 後出し乙。 ハイ、次の方どうぞ ↓
514 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/01(木) 22:51:19 ] >>510 #!/bin/sh ( ( while IFS= read line do if echo "$line" | grep -q XXX then echo "$line" else echo "$line" 1>&3 fi done | command_A 1>&4 ) 3>&1 | command_B ) 4>&1
515 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/01(木) 23:03:55 ] command_A, command_Bに確実に一行ずつ出力させる事が出来なければ不可能。
516 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/01(木) 23:18:02 ] >>514 素早い回答、ありがとうございます。 ファイルディスクリプタんの複製なんて、10年振りに見ました。 このスレは初探訪なのですが、スレ住人の方々はみな、このような スクリプトを自在に操る変態さんばかりなのでしょうか。 まだまだ精進が足りないと痛切に思いました。 自在にこんなスクリプトが書けるまで、精進したいと思います.... ところで、この"grep -q" って、入力毎に起動しているようですが、 これはずっと起動しっぱなしに比べて、パフォーマンス的にはどうなんでしょう。 実はgrepのこういう多数回の起動(fork())ってそんなに大変なことではない??
517 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/01(木) 23:24:12 ] >>515 うーむ、さきにcommand_Aの方が処理された後に、command_Bの方が 実行されるみたいですね。やっぱり無理かなぁ。
518 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/01(木) 23:24:43 ] >>516 正規表現じゃなくて、単なるパターンマッチで良ければ、 grep -q の代わりに case文を使えば、 内部コマンドだけになるから速くなるよ。
519 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/02(金) 01:29:03 ] シェルスクリプトを、別のシェルスクリプトの中からをバックグラウンドで実行すると SIGINTが無視されてしまうんだけど、何とかSIGINTをトラップできる ようにする方法ありませんか? 例えば以下のようなシェルスクリプト command.sh を作って、 #!/bin/sh trap 'echo sigint' INT trap -p インタラクティブなシェルから command.sh & すれば期待通り動くんですが、 別のシェルスクリプトの中から command.sh & で呼び出すと SIGINT のハンドラが 設定されないんです。 この動作自体は一応 bsh 系の仕様っぽいですが… Linux 上の bash 限定でも良いので、何か解決法があったら教えてください。
520 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/02(金) 06:45:21 ] >>519 シェルスクリプトの中から、 sh -c 'set -m; command.sh &' で呼び出す。
521 名前:名無しさん@お腹いっぱい。 [2009/10/03(土) 09:28:17 ] >>481 のやり方ってネストは2個まで? commandD `commandC \`commandA \`commandB\`\`` でやったら上手くいかなかったような。。。(bash)
522 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/03(土) 09:42:57 ] あたりまえ。\もエスケープしなければダメ。
523 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/03(土) 09:46:57 ] >521 commandD `commandC ¥`commandA ¥¥¥`commandB¥¥¥`¥``
524 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/03(土) 09:48:20 ] >>521 3個でもできるよ。 commandD `commandC ¥`commandB ¥¥¥`commandA¥¥¥`¥``
525 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/03(土) 09:50:21 ] >>522-523 お、言われて見ればその通りだ。 ありがとぅ。
526 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/03(土) 09:51:31 ] >>524 ありがとぅ。
527 名前:名無しさん@お腹いっぱい。 [2009/10/04(日) 17:20:27 ] 時々シェルスクリプトで簡単なツールを作ったりしてるのですが perlを勉強してみたくなりました。 >>1 に ・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも RubyやPerlの方が適した仕事には素直にそちらを使いましょう。 とありますが、具体的にどのような観点でシェルスクリプトとperlを使い分けするのでしょうか? このような処理ケースではperlを使う方が効果的みたいな例を教授 (もしくはそのような事が記載されているサイトに誘導)していただけたら幸いです。
528 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/04(日) 17:26:53 ] 現状でシェルスクリプトで問題なくやってるなら、 perlなんて覚えない方がいい。
529 名前:527 mailto:sage [2009/10/04(日) 17:27:13 ] 少し調べてみてるのですがPerlは文字列処理等が得意であるというのを見ますが、 そうするとsedやawkを使う場面なんかがperlでやった方がよりよいでしょうか?
530 名前:527 mailto:sage [2009/10/04(日) 17:34:22 ] >>528 現状、何とか目的の機能は達成してるって感じですが、 同じ事がperlなら断然簡潔かつ高速処理で出来たりするのかな?なんて思うもので。。。
531 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/04(日) 17:47:06 ] 3項演算子は両方とも評価するのか?
532 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/04(日) 18:05:40 ] >>529 例えば一行の処理毎に、シェルスクリプトでは外部コマンドを起動する必要がある、 perlでは不要。というような場合、データが大きくなればperlの方が速くなる。
533 名前:529 mailto:sage [2009/10/04(日) 18:31:28 ] >>532 それはテキストの一行に対して処理する事に対し、シェルスクリプトならその行数分外部コマンドが実行、 つまりシェルスクリプトでテキストの1行に1コマンド処理実行させてる場合、 100行なら100回外部コマンドが実行される事になるが perlなら1コマンド?で処理が終了するので大きいテキストに対してだと 処理スピードに差がでるって事でしょうか?
534 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/04(日) 18:45:38 ] テキストの一行じゃないんじゃないの。sedもawkも複数行を処理できるでしょ。 あとマルチコアプロセッサとかだと、プロセスが分かれていた方が処理が早く 終わったりもするね。 キッチンシンクアプローチとツールボックスアプローチを調べてみると良いと思うよ。
535 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/04(日) 18:58:02 ] >>533 そう。プロセスの生成は非常にハイコスト。
536 名前:529 mailto:sage [2009/10/04(日) 19:12:23 ] >>534-535 ありがとう。 うーん、でも完全に理解し切れてない。 何かを実現させる時、シェルスクリプトの場合複数のコマンド発行(プロセス起動)が perlなら少プロセスで可能な場合(主にテキスト処理などで)があるって事でしょうか? >キッチンシンクアプローチとツールボックスアプローチを調べてみると良いと思うよ。 調べてみます。
537 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/05(月) 00:38:28 ] python
538 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/05(月) 02:27:03 ] オライリーのミニマルPerlって本があって、 sh&sed&awk の粗探しをして Perl への移行を薦めるような内容なんだが、 これ読むと逆に、とくに大規模でもないテキスト処理なら シェルで無問題じゃんって感じなんだよね。 Perlが受けたのは、第一に実装が優秀で速かったのと、 あと Perl はベル研系の厳格な雰囲気がないというか、 何となく書いて動いちゃうとこがある。そのへんの寛容さが人気の秘密かと
539 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/05(月) 15:57:27 ] 結局適材適所と、それを判断出来る能力の問題だと思うよ。 シェルスクリプトで遅いなら、perlなりでやる。それでも遅いならCとか。
540 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/05(月) 18:06:14 ] echoで最後に改行したくない場合、 echo -n "unko" では期待通りに出力されるのですが、 echo "unko\c" だとunko\cと改行して出力されてしまいます。 Cygwinで\cに対応させるにはどうしたらよいでしょうか。 よろしくお願いいたします。
541 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/05(月) 18:15:13 ] >>541 CygwinということはGNU coreutilsのechoか。 -e オプション?
542 名前:540 mailto:sage [2009/10/05(月) 19:05:48 ] >>541 おおお、ありがとうございます。 $ echo -e "unko\c" で期待通り unko$ と出力ができました。 本番の環境はHP-UXを使用しておりまして、 逆に-eオプションが無い(?)ため、 $ echo -e "unko\c" とした場合、 -e unko$ と出力されてしまいすが、とりあえず、 alias echo='echo -e' で解決いたしました。 ありがとうございました!!!!
543 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/05(月) 21:56:31 ] そのへんの移植性に関するバッドノウハウはGNU autotoolsに詰まってる。
544 名前:名無しさん@お腹いっぱい。 [2009/10/21(水) 12:16:25 ] RCSで、チェックイン済みの最新リビジョンと、そのひとつ前のリビジョンを比較 ということをよくやります。 今は、rlog -r fileで最新リビジョン番号を調べて、たとえば 1.123 だったとすると、 頭の中でリビジョンを1引いて、rcsdiff -r -r1.122 file みたいに実行しています。 これを1発でやるシェルはできませんか? あ、sed/awk等でゴニョゴニョやる方法じゃなく(それしかないなら自分でやるので)、 奇麗にエレガントにやる方法を希望します。
545 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/21(水) 18:10:19 ] よく知らないで申し訳ないが current=`rlog -r file | grep 'なんとか'` current=`expr $current - 0.001` rcsdiff -r -$current file 空白とか改行とか考慮せずかなり適当に書いたけど。 exprでできないならbc使えばできるかもしれない。