- 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/
- 754 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/30(水) 00:24:04 ]
- auto-split後だからchopするとしたら
chop($F[$#F]);
- 755 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/07(木) 21:10:23 ]
- run.shファイルの中で、script_file.shをsourceした場合。
sourceされているscript_fileの中でscript_file自身の絶対パスを得る方法を調べています。 bashの場合はscript_fileの中で$BASH_SOURCEから得られるが、他のシェル(zsh/tcsh/ksh)でscript_file.shのパスを得られる方法を 教えていただけませんか? >>>>>>>>>>>>>>>>>>>>>> script_file.shファイルのある場所 /path/to/script_file.sh >>>>>>>>>>>>>>>>>>>>>> 実行例: %./run.sh 期待結果: /path/to/ ファイル <run.sh>の中身 ------------- #!/bin/(sh/zsh/tcsh...) source $path/script_file.sh ------------- ファイル script_file: ------------- script_file_path=`******` echo $script_file_path; -------------
- 756 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/07(木) 21:31:48 ]
- >>755
他のシェルのソースを改造して $BASH_SOURCEの機能を実装すれば桶。
- 757 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/07(木) 21:50:29 ]
- >>756
早速のレスありがとうございます。今環境がないので明日試してみます。
- 758 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/07(木) 22:13:18 ]
- こりゃ、わかって無いな。
- 759 名前:名無しさん@お腹いっぱい。 [2010/01/08(金) 13:35:29 ]
- 制限時間を設定して、2つのプロセスを実行して、時間内に1つでもプロセスが終了しなかったら2つともキルして、もう一度最初から実行するにはどのように記述すれば良いのでしょうか?
ご教授ねがいます
- 760 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/08(金) 14:04:43 ]
- どこの馬の骨かわからん奴に教授はしない。
- 761 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/08(金) 14:41:28 ]
- >>759
同条件で、最初から再実行したら、また時間内に プロセスが終了しないのでループしちゃうのでは?
- 762 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/08(金) 14:52:01 ]
- >>716
ループしてもいいから、まずはやり方を教授しろよ
- 763 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/08(金) 14:57:34 ]
- >>761
ネットとか、I/Oポートとか、外的要因が絡んでるのなら 同条件で、最初から再実行してもループしない。
- 764 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/08(金) 15:00:24 ]
- >>762
だから、誤用だけど言葉として正しい と言ってるだろバカ
- 765 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/08(金) 18:36:31 ]
- >>764
誤用する奴には教えないと言っているのだ。バカ。
- 766 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/08(金) 18:43:35 ]
- うるせー馬鹿
- 767 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/08(金) 18:53:46 ]
- いい加減ウザイよ。
- 768 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/08(金) 19:02:39 ]
- >>765
仮に誤用してなかったとしても肝心の質問の答を知らないくせに
- 769 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/08(金) 19:22:50 ]
- 煽って答えがもらえるのは小学生まで
- 770 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/08(金) 19:24:23 ]
- >>768
惨めだなあ。馬鹿丸出しの言い逃れを↓で完璧にのされたのを忘れてまた出てきやがった。 From: [719] 名無しさん@お腹いっぱい。 <sage> Date: 2009/12/21(月) 18:25:12 >>716 アホ丸出しの言い訳止めろ。>>695の用法も正しいと言うのがお前の主張(>>705)。 >>696はオレじゃないが、誤用に対して「あげない」とからかっている。 お前は用法を知らずに揚げ足とったつもりで恥を晒したうえに、小学生並みの見苦 しい言い逃れを続けている単なるバカ。お前の負け。 >>705 > 「ご教授ください」=「体系だててきちんと教えてください」(同値) > >>695 には「ご教授ください」と書いてある、 > イコール > >>695 は「体系だててきちんと教えてください」と言っている
- 771 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/08(金) 21:13:41 ]
- >>759
#!/bin/sh program1 & p1=$! program2 & p2=$! sleep 60 kill -0 $p1; is_p1=$? kill -0 $p2; is_p2=$? if [ $is_p1 = 0 -o $is_p2 = 0 ] then kill -9 $p1 $p2 sh $0 fi
- 772 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/08(金) 21:24:43 ]
- 1 SIGKILLは安易に使ってはいけない。
2 exec sh $0
- 773 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/08(金) 21:57:52 ]
- シェルをexecし直すのは効率が悪い。while文で書ける。
#!/bin/sh while : do program1 & p1=$! program2 & p2=$! sleep 60 kill -0 $p1; is_p1=$? kill -0 $p2; is_p2=$? if [ $is_p1 = 0 -o $is_p2 = 0 ] then kill -9 $p1 $p2 continue fi break done
- 774 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/08(金) 22:06:04 ]
- SIGTERM と SIGINT のどちらを使うべきか
いまだによくわからないのはオレだけでいい
- 775 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/08(金) 22:11:32 ]
- SIGKILLでおk
- 776 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/08(金) 22:19:31 ]
- >>771 >>773
program1やprogram2が 60秒以内に正常終了した場合には、 sleep 60 せずにスクリプトもすぐ終了したいんですが、、
- 777 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/08(金) 22:45:57 ]
- 「ご教授ねがいます」なんていう奴は、これだよ
- 778 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/08(金) 22:56:17 ]
- ご教授ねがえります
- 779 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/08(金) 23:06:34 ]
- ご教授ねがえったか
- 780 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/08(金) 23:47:21 ]
- 謀反でござる!
謀反でござる!
- 781 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/09(土) 05:41:48 ]
- 女教授おながいします
- 782 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/09(土) 07:47:50 ]
- 質問 >>759 >>776 について、
「ご教授」の突っ込みと誤答ばかりで、 ==== ここまで正解ゼロ ====
- 783 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/09(土) 11:58:33 ]
- 釣り板の釣りスレでマジ回答したら負け
- 784 名前:771 mailto:sage [2010/01/09(土) 14:46:50 ]
- >>776
sleep 60の代わりに、それらのプロセスが終了したか チェックすればいい t=0 while t=`expr $t + 1`; [ $t -lt 60 ] do kill -0 $p1; is_p1=$? kill -0 $p2; is_p2=$? if [ $is_p1 != 0 -a $is_p2 != 0 ] then break fi sleep 1 done
- 785 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/09(土) 15:03:34 ]
- お題を良く読みましょう。「制限時間」
オレはご教授しないけどな。
- 786 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/09(土) 15:06:52 ]
- >>784
それ、1秒間隔でポーリングしてるだけなので、 やっぱり最大1秒遅れるので、ダメです。
- 787 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/09(土) 19:46:58 ]
- #!/bin/sh
T1=`date "+%s"` T2=0 T3=0 STS=1 while t=`expr $T3 - $T1`; [ $t -lt 最大制限時間 ] do program1 & p1=$! program2 & p2=$! T2=`date "+%s"` T3=0 while t=`expr $T3 - $T2`; [ $t -lt 制限時間 ] do kill -0 $p1; is_p1=$? kill -0 $p2; is_p2=$? if [ $is_p1 != 0 -a $is_p2 != 0 ]; then STS=0 break 2 fi T3=`date "+%s"` done kill -9 $p1 $p2 done exit $STS もっとスマートに書けると思う ご教授しる
- 788 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/09(土) 19:47:22 ]
- いやです
- 789 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/09(土) 20:33:37 ]
- >>787
それ、ビージーループになってて重いのでNGです
- 790 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/09(土) 22:00:20 ]
- waitすればいいやん
sleep 60 &して、これも含めた三つのpidをwait。 コードは書かないでおくが。
- 791 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/09(土) 22:03:13 ]
- >>790
複数のプロセスをwaitすると、全部が終了するまで返って来ないという仕様なのでNG
- 792 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/09(土) 22:34:21 ]
- ソケット通信でprogram1,2の終了を
管理プロセスに通知する仕組みにすれば 何とかなるかもしれないが、 シェルだけでは無理だね
- 793 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/09(土) 22:38:41 ]
- んなぁこたー無いが、ご教授はしない。
- 794 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/11(月) 01:17:26 ]
- 下の input.txt から output.txt を作るにはどうすればよいでしょうか?
input.txt は1列のデータで、output.txt は、 input.txt の1列目から1行目を削除して2列目に並べたものです perl か何かに全部読み込んで・・・という方法しか思いつかないのですが ワンライナーでさくっとやる方法あったら教えてください ### input.txt 1 2 3 5 6 ### output.txt 1 2 2 3 3 5 5 6
- 795 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/11(月) 01:25:06 ]
- (read a; while read b; do echo $a $b; a=$b; done) <input.txt >output.txt
- 796 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/11(月) 01:53:40 ]
- >>795
ありがとうございます 目から鱗です
- 797 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/11(月) 12:54:30 ]
- >>794
横方向に連結する場合、 paste を使うのが基本 paste - - < input.txt
- 798 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/11(月) 12:59:32 ]
- あ、よく読んでなかった。こうか
# tail -n +2 input.txt | paste input.txt - > output.txt
- 799 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/11(月) 13:27:17 ]
- >>798
なぜ #プロンプト…
- 800 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/11(月) 13:49:45 ]
- あ、いや、特に考え無しに・・。 $ が一般ユーザで、# が root だっけ
- 801 名前:759 mailto:sage [2010/01/11(月) 14:32:31 ]
- 放置してしまってすみません。
みなさんありがとうございます。 >>776さんは自分ではありません、まったくレスしていないので逆に失礼ですが。
- 802 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/11(月) 19:14:45 ]
- >>800
古くはさらに、$と%をそれぞれBourne ShellとC Shellの一般ユーザー プロンプトとしたものだけれど、いまはそこまで厳密に使う人はいない かもなー。 zshは基本的には$系のはずなのにデフォルトが%なのはちょっと不思議。
- 803 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/11(月) 23:07:53 ]
- 以下の処理のリダイレクトについて教えていただけますでしょうか?
もしくは、よくある処理のようなので解説しているサイトを教えていただけますでしょうか? commandの結果を取得しつつ、画面及びファイルに出力 status=`exec 3>&1; { command 2>&1 3>&-; echo $? 1>&3; } | tee command.log 1>&2 3>&-` echo $status @execにより3で1を指した後にcommand実行時に3を閉じてるのは何故でしょうか? 必要性がよくわからないです。 同時に1が閉じられることはないですよね? Aどういう経路でcommandの結果はstatusに格納されているのでしょうか? Btee実行時に行っているリダイレクトの意味はどのようなものでしょうか? 正直言って全体的によく分からないです。
- 804 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/11(月) 23:22:23 ]
- >>803
機種依存文字は書き換えました (1)commandが3に出力しないように念のため (2) echo $? が 3に出る。3には、あらかじめexec 3>&1 によって、 パイプではなく、コマンド置換(バッククォート)に通じる標準出力が 複製されている。よって、echoが 3に出せば 変数statusに入る。 (3)teeがcommandの出力をcommand.logに書くと同時に 同じものを 1に出そうとするが、1にそのまま出すと変数statusに入ってしまうので 2にリダイレクトして画面に表示されるようにしている。 3>&-は(1)と同じく念のため。 以上、ご教授しましたw
- 805 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/11(月) 23:49:50 ]
- >>804
ありがとうございました。 command時に3を閉じてるので、echo時に1>&3としても出力されないと勘違いしておりました。 それと(3)について、command時に2>&1としていますが、 これはtee時の2には引き継がれないのでしょうか? 引き継がれていると、1>&2とすると元に戻って1に出力して statusに上書きしてしまうように見えます。
- 806 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/12(火) 06:29:53 ]
- >>805
commandとechoは無関係。 exec 3>&1したものが、commandとechoに並列して引き継がれる。 command側では3は不要なので閉じてるだけ。 commandの2とteeの2は無関係。 commandの1はパイプにつながっているので、 commandの2もパイプに流すためにcommand 2>&1 してるだけ。 teeはそのパイプを0で受けとる。 teeの1や2はcommandとは無関係で、デフォルトのまま。 そこで tee 1>&2 で画面に出す。 以上、俺もご教授しましたw
- 807 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/12(火) 09:40:26 ]
- >>806
ありがとうございました。 全て理解できました。
- 808 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/12(火) 18:20:04 ]
- つまり要約すると「ご教授」で正しかったのですね。
全て理解できました。
- 809 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/12(火) 18:37:12 ]
- つまり要約すると「ご教授」で正しかったのですね。
全て理解できました。
- 810 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/12(火) 19:15:58 ]
- 大事なことなので二度言いましたよ
- 811 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/12(火) 19:41:07 ]
- >>803ではありませんが・・・
パイプがあっても1 2ともにデフォルト (パイプの左側で1 2が書き換えられていても、右側ではデフォルトに戻る) ただし新しいfdが作られていると、その先も残ったまま。 (パイプの左側で3が作られていると、右側でも3が作られている状態) パイプの左側では標準出力がパイプに渡される パイプの右側ではパイプから標準入力を受け取る コマンド置換は、最初のパイプの前までの標準出力を受け取る これで理解できてますか?
- 812 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/12(火) 20:32:25 ]
- >>811
違うね。 >(パイプの左側で1 2が書き換えられていても、右側ではデフォルトに戻る) ↑ 「右側ではデフォルトに戻る」のではなく、 そもそも最初からデフォルトのまま変化しない。 >ただし新しいfdが作られていると、その先も残ったまま。 ↑ パイプの左側で新しいfdが作られても、その先には無関係(残らない)。 >>803 では、あらかじめ execでfdを作っているから、 それを全体が受け継いでいるだけ。これと混同してはいけない。 >コマンド置換は、最初のパイプの前までの標準出力を受け取る ↑ 「最初のパイプの前」じゃなく、パイプラインの最後のコマンドの標準出力を受け取る で、お約束の「ご教授しました」
- 813 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/12(火) 21:37:11 ]
- 誤教授しましたと言うべき。
- 814 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/12(火) 22:00:01 ]
- >>812 thx
おおよそ理解しましたが、 2個目と3個目のレスが気になります。 > パイプの左側で新しいfdが作られても 新しいfdを作るにはexecしかないと思っていたのですが、これ以外で作れるのですか? ・・@ それとも、シェルから呼び出されたコマンドの中で作られたfdでは > 無関係(残らない) だけど、execで作っているときは受け継ぐという意味ですか?・・・・・・・・・・・・・・・・・・・・・・・・・A それと > それを全体が受け継いでいるだけ。 というのはそのシェル内で n>&- するまで有効という意味でよいですか?・・・・・・・・・・・・・・B 更にサブシェルにも受け継がれますか?・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・C 3個目の方は > パイプラインの最後のコマンドの標準出力 とありますが、これはteeの標準出力ではないのですか?・・・・・・・・・・・・・・・・・・・・・・・・・・・・・D (でも1>&2しているので、どうなるんだろう。teeは標準出力がなくなるので、3に書き込んだechoということなのかしら) 質問ばかりですみません。
- 815 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/12(火) 22:02:31 ]
- C更にサブシェルにも受け継がれますか?
forkするプログラム書いたことあるのを思い出しました。 たしか親からfd受け継いだはずなので、これは受け継がれますよね。
- 816 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/12(火) 22:23:58 ]
- >>814
だから、機種依存文字を使うなと、、 (1)exec以外でも勝手に新しいfdを使えるよ。 ただ、そのコマンド1つだけに有効になる。 (ここでいうコマンドには、サブシェルなどのコマンド群全体も含む) (2)execでは、シェル自体のfdが変わるので、以降のコマンドすべてに影響。 (ただし、サブシェル内でexecした時はそのサブシェル内のみ) (3)いいよ。あと、n>&-だけじゃなく、n>&mで別の値を複製しなおすと execの影響は無関係になる。 (4)サブシェルにも受け継がれる (5)teeの標準出力だよ。で、標準出力に出ないように 1>&2してる。 3に書き込んだechoもパイプライン全体の標準出力だからコマンド置換に取り込まれる。 teeで1>&2するのと、echoとは無関係。
- 817 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/13(水) 18:38:41 ]
- 丁寧なご説明ありがとうございます!
- 818 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/13(水) 23:59:12 ]
- しかしほんとに「機種」依存文字なのか?
乗っかってるソフトウェア依存文字じゃないのか? とりあえず俺は読めるし、歴史的に俺の使っている機種が Cを表示できるはずは無いのだけれど、表示出来ているわけよ。 (どのようにタイプしたらその字が出せるか解らんが、とりあえずコピペは出来る) FreeBSD で LANG eucJP なのだが、2ちゃんねるビューワだとCが読めるし コピペで転記できるよ。(書き方は不明) ほんとに機種に依存するの?
- 819 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/14(木) 00:04:36 ]
- ググレカス
- 820 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/14(木) 00:38:24 ]
- 丸数字やローマ数字を機種依存文字と呼ぶのは
おかんが家庭用ゲーム機ならPS3も360もファミコンと呼ぶのと同じで 言葉にこだわる必要はありません
- 821 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/14(木) 00:52:50 ]
- 丸数字が機種依存とか言われたのは歴史的経緯だわな
今や機種依存どころかUnicodeというれっきとした国際標準に含まれてる 2chで今更丸数字使うなっても化石じみてて何だかな
- 822 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/14(木) 00:55:09 ]
- 2chが化石Shift_JIS使ってるかぎり言われつづける
- 823 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/14(木) 03:41:02 ]
- 2chはcp932だろ
- 824 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/14(木) 04:14:23 ]
- 時代は UTF-8 ですよ
- 825 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/14(木) 04:16:28 ]
- いまどきの機種依存文字といえば「〜」かな
- 826 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/14(木) 08:28:32 ]
- >>825
誰もがWindows-31JとShift_JISの区別を付けるようになれば 片が付くのにね……
- 827 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/14(木) 09:05:59 ]
- うちのMacちゃんでは2chのカキコのローマ数字が化けるざんす。
- 828 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/14(木) 09:44:45 ]
- この板の住人ならOSは関係ないってことくらい分かるだろ
MacJapaneseの代わりにWindows-31Jで処理するようなライブラリ使って FirefoxでもChromiumでも何でもビルドすればいいだけ
- 829 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/14(木) 21:53:24 ]
- 半角カナは使ってもいいと思う
- 830 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/14(木) 23:02:10 ]
- >>828
じゃあsafariをビルドする方法を教えてください。
- 831 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/14(木) 23:41:43 ]
- フィルタリングプロキシを立てて
Windows_31JくさいShift_JISなページをUTF-8に変換してやるのが楽じゃないかな
- 832 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/15(金) 00:12:46 ]
- それはクライアント側でフォントいじれよっていうのと等価では?
- 833 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/15(金) 00:29:34 ]
- 丸数字使うな。カス。と言う方が楽だしecoだな。
- 834 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/15(金) 01:08:33 ]
- エコロジストならスレ違いネタでスレを消費しないでくれ
- 835 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/16(土) 01:23:40 ]
- bashでif〜とする時、[ と [[ ができますが
[ は 外部のtestコマンドで、[[が内部コマンドなんですよね? [ ではなく [[ を使った方が 速度が速いのでしょうか?
- 836 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/16(土) 01:50:26 ]
- bash の [ と test は builtin。[[ は compound command。
[[、[、外部コマンドの test の順に速い。 外部コマンドを呼んだ場合がダントツで遅くて、他の50倍ぐらい遅い。[[ と [ は大して変わらん。
- 837 名前:835 mailto:sage [2010/01/16(土) 02:16:10 ]
- お答えありがとう。
- 838 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/16(土) 12:01:06 ]
- >>834
富豪プログラマのスレです。
- 839 名前:名無しさん@お腹いっぱい。 [2010/01/26(火) 12:21:42 ]
- ●やりたいこと
カレントディレクトリ以下の全ファイル(レギュラーファイル,かなり大量,何百万単位)を 検索し,ファイル名,ファイルサイズ,MD5ハッシュ値を出力したい。 1ファイルにつき1行。 ※効率よくやりたいのでファイルの数ごとにstatやmd5プロセスを起動する,という ことは避けたい。 ●やったこと ファイルサイズだけ,とかMD5だけなら下記の方法で満足な早さで出力が得られます。 環境はMac OS Xです。 find . -type f | xargs stat -f '%N,%z' > outputfile.txt find . -type f | xargs md5 $1 | sed -E 's/^MD5 \((.*)\) = (.*)/\1,\2/' > outputfile.txt 上の二つを合わせたようなことをしたいのですが,うまい方法を教えて下さい。
- 840 名前:名無しさん@お腹いっぱい。 [2010/01/26(火) 12:24:01 ]
- 補足
各行が ファイル名,ファイルサイズ,MD5ハッシュ値 という出力にしたいです。
- 841 名前:名無しさん@お腹いっぱい。 [2010/01/26(火) 12:27:06 ]
- コピペミスです。>>839の2つ目のfindは正しくは
find . -type f | xargs md5 | sed -E 's/^MD5 \((.*)\) = (.*)/\1,\2/' > outputfile.txt でした。
- 842 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 12:49:51 ]
- perlかpythonかrubyで書きなよ。
- 843 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 12:52:31 ]
- ●解答
joinすればいいだけ。 ●補足 箇条書での質問は失礼
- 844 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 13:01:19 ]
- ●傍観者の感想
ワロタ
- 845 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 13:31:04 ]
- pasteというコマンドがあってだな。
- 846 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 14:55:29 ]
- sed が起動するのは気にならないのかw
- 847 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 15:05:51 ]
- >>846
そりゃ、sedは1回しか起動しないし
- 848 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 16:46:34 ]
- 次スレのテンプレに↓入れとけよ
●解答 perlかpythonかrubyで書きなよ。
- 849 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 16:50:45 ]
- >>848
>>1 ・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも RubyやPerlの方が適した仕事には素直にそちらを使いましょう。 Pythonも入れればよいわけだな。
- 850 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 16:52:39 ]
- で、今回の質問の場合 perlもpythonもruby関係なくて、
joinかpasteで済む問題だったわけだが、、
- 851 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 17:03:54 ]
- join, pasteは中間ファイルを作るわけだが、数百万ファイルになるとかなりのオーバーヘッドになる。
実行時間はファイルIOが支配的なのでインタプリタが消費するCPUは隠される。 従ってLLでの実装を勧めたわけだが、初心者にはわからないらしい。覚えておく事だ。
- 852 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 17:35:37 ]
- >>851
中間ファイルを作らずにnamed pipeでやる方法を知らない初心者らしい、、
- 853 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 18:31:25 ]
- この件では I/O にかかる時間でいちばん支配的なのは
find, md5, stat,(+ join を使う場合は sort)であって、 中間ファイルを使うことによるオーバーヘッドなんぞ誤差にしかならんよ。
- 854 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/01/26(火) 18:34:04 ]
- 中間ファイルって、MS-DOSじゃないんだから・・・
|

|