|
>>2954 kiki つまりやってることは >>2953 68user のスクリプトと同じなわけで、こちらで実行すると 2回目の su で /usr/bin/su を実行してくれました。 ということは bash が原因なわけで、ハッシュテーブルを再構築 しない設定になっているのでは、などを疑うべきなんでしょうけど、 bash は使ってないのでよくわかりません (勝手にハッシュテーブル 再構築してくれるんじゃないのかな?)。そこらへん何か設定がある んでしたっけ。 あとは bash の最新版を入れてみるとか。 |
|
>>2954 kiki bash-2.03.0(1)-release と bash-2.05a.0(1)-release でやって みましたが、どうやら PATH=.:$PATH だと OK (/usr/bin/su が実行される) ですが PATH=/foo/bar:$PATH と絶対パスで設定すると /foo/bar/su が hash に残っているようですね。 マニュアルを読む限りでは bash の仕様のような気がしますし、相対 パスのコマンドが hashing されていた場合は (カレントディレクトリが 移動しているかもしれないので) 再度 PATH を検索する、というのは 納得のいく挙動です。 # でも、もしかしたら bash のバグかもしれません。 解決策としては % shopt -s checkhash があげられるでしょうけど、これだと操作者の協力が必要なので、トロイの su を作るという目的を第一に考えるのであれば、 1. PATH=../../../../../../../../../../../../home/foo/bar:$PATH とする。 カレントディレクトリの階層があまりに深くなければ、これでいける。 2. トロイ版 su の中で /usr/bin/su を exec する といったところでしょうが、普通は 2 のような気がします (作ったことないのでわからんけど)。 |
|
みなさん、計算の問題でフォローアップありがとうございます。 とりあえず Math::BigFloat で快適です。 3471943.48 および 3471943.488 という数を 0 と比較すると おかしいという現象があって一瞬ひやっとしましたけど、 5.005003 ではバグってるけど 5.6.0 では直ってるようでした。 ■ソース #! perl use Math::BigFloat; while (<DATA>) { chomp; $num = Math::BigFloat->new($_); if ($num >= 0) { print "$num is larger-equal than 0\n"; } else { print "$num is not larger-equal than 0\n"; } $cmp = $num->fcmp("0"); print "compare $num vs 0: $cmp\n"; } __DATA__ 3471943.488 3471943.48 3 ■5.005003 での実行結果 3471943.488 is not larger-equal than 0 compare 3471943.488 vs 0: -1 3471943.48 is larger-equal than 0 compare 3471943.48 vs 0: -1 3. is larger-equal than 0 compare 3. vs 0: 1 ■5.6.0 での実行結果 3471943.488 is larger-equal than 0 compare 3471943.488 vs 0: 1 3471943.48 is larger-equal than 0 compare 3471943.48 vs 0: 1 3. is larger-equal than 0 compare 3. vs 0: 1 |
|
>>2956 68user様 またお返事が送れて申し訳ありません.kikiです. お返事ありがとうございます.早速ためしてみます. この質問を通じて,いろいろ知らないこともわかったので その点でもとても勉強になりました. ありがとうございました. |
|
初めてになりますが、質問がありますので、お力添えをお願いします。 プログラムの実行時間を計るために、timeコマンドがありますが、このときに出力される結果を、指定したファイルに書き込む方法はないでしょうか? リダイレクトを使って、 time 実行するコマンド > ファイル名 としても、ファイルに結果が出力されませんでした。プログラムの実行時間を書き込むための良いアドバイスをお願いします。 |
|
>>2959 KENT1 お使いの OS とシェルを必ず書いてください…と言うのも疲れたので、 てきとーに試してみてください。 /usr/bin/time ls >& file /usr/bin/time ls >file 2>&1 env TERM= csh -c "time ls" > file env TERM= bash -c "time ls" > file |