1 名前:名無しさん@お腹いっぱい。 [2008/02/11(月) 19:21:07 ] シェルスクリプトの総合スレです。 スクリプトのお勉強・自慢・腕試しなどにどうぞ。 まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。 前スレ シェルスクリプト総合 その9 pc11.2ch.net/test/read.cgi/unix/1187130302/
487 名前:名無しさん@お腹いっぱい。 [2008/03/31(月) 02:16:54 ] とりあえず正常化 仕切り直していきましょう
488 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 03:17:20 ] Mysqlバックアップ処理や別サーバへのFTP通信等を 行いたいのですが、 mysqldump -u root -p password のようなコマンドを打つとpsなどで パスワードがローカルユーザーに漏れる可能性があるかと思います。 何か良い隠ぺい策ってないでしょうか?
489 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 03:21:23 ] expectスクリプト
490 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 04:11:10 ] expect以外のよい方法ってないでしょうか? パスワード遮蔽のみのために expectを用いるのは結構つらいと感じましたので。。。。 すいません。。。。
491 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 06:29:31 ] 原則としてコマンドライン引数にパスワードを直接書くのはダメ。 mysqldumpの仕様によるのでここではなくMySQLのスレ(データベース板?)できくべきだが ・パスワードをファイルに保存してそれを引数に与える ・コマンドが読む設定ファイルにパスワードを書く ・環境変数でパスワードを与える などコマンドラインで暴露しない方法が必ずある筈。調べてみて。
492 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 07:03:12 ] 正常化したかと思ったらスレ違いネタ,,
493 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 08:14:21 ] >>490 バックアップ専用のユーザを作って、そのユーザで実行すれば他のユーザからは隠蔽される。 他のユーザから見えてしまうような環境なら、別マシンで実行すべし。
494 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 08:19:50 ] はぁ?
495 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 10:21:08 ] > ・環境変数でパスワードを与える 嘘を教えないように。
496 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 10:29:56 ] おそらく、環境変数をコマンドラインで展開せずに、 実行コマンドが直接 getenv()とかで環境変数を読めば問題ないと 勘違いしたんだろうが、環境変数にパスワードを設定するのは論外。 ps e すれば環境変数の内容は丸見え。
497 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 10:33:59 ] >>495 嘘じゃなくて推測でしょ。
498 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 10:51:36 ] うそ【嘘】 2 正しくないこと。誤り。
499 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 10:52:41 ] 正しい方法知ってるなら教えてあげたら?
500 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 11:07:28 ] お前自分で書いてるだろ。 > mysqldumpの仕様によるのでここではなくMySQLのスレ(データベース板?)できくべきだが このスレでは、コマンドラインで暴露しない方法として「環境変数でパスワード渡す」は真っ赤な嘘。 という事を指摘すればよい。 お前、プライド(ぷぷっ)に実力が追いついてないぞ。
501 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 11:21:38 ] APOPみたいにチャレンジからMD5で計算して渡すように 仕様変更すればいいんだよw
502 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 11:29:22 ] 引数に渡すときに? いずれにせよ、どこかで生パスワードが必要じゃん。
503 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 11:41:46 ] >>502 だからAPOPみたいにって言ってるだろ。 APOPの結果を引数に付けて丸見えになっても無問題。
504 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 11:50:52 ] そのAPOPの結果を求めるコマンドにはどうやってパスワードを...
505 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 11:54:44 ] 環境変数で渡すんだよ!
506 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 11:59:34 ] 最初のコマンドはexpectスクリプト使えば(以下無限ループ
507 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 12:04:33 ] >>504 結果を求めるコマンドが、別ファイルからパスワードを読めばいいだけ。 頭使えw
508 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 12:18:34 ] >>507 つまらんな。仕様変更するならパスワード不要の方法に変更しろ。
509 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 12:24:29 ] というか、仕様変更するなら最初からファイルからパスワードを読むように 仕様変更すればいいだけ
510 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 12:35:12 ] expectが大きすぎるならttyrec/ttyplayだね。 本人登場しないし、この話題はもういいんじゃない?
511 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 13:27:19 ] >>510 ttyrec/ttyplayでどうやるの?
512 名前:510 mailto:sage [2008/03/31(月) 14:04:25 ] そこまでやるのはスレ違いだからマニュアル読んで。
513 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 14:10:20 ] >>512 man ttyrec 読んだけど >>488 に使えそうな機能見あたらないよ。 どの辺に書いてあるの?
514 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 14:12:46 ] 見つけられないなら仕方ないですねw
515 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 14:35:22 ] >>496 君の使ってるOSだとpsで他ユーザのプロセスも環境変数が見えるの? 見えるとしたらそれ、脆弱性だから。 Solarisでもパッチ出てるだろ。
516 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 14:53:58 ] MySQL 6.0の公式リファレンスでは (5.5.6. Keeping Your Password Secure dev.mysql.com/doc/refman/6.0/en/password-security.html ) -pオプションはインセキュアであるとして、セキュアな方法として * Store your password in an option file. * Store your password in the MYSQL_PWD environment variable. を挙げてるな。 環境変数が問題だというならMySQLの公式リファレンスも直させなきゃな。 まあ、頑張れw
517 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 14:57:01 ] 裏も取らずにテキトーなこと言うやつが多過ぎるな。
518 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 15:33:42 ] Solarisのはこれか。 sunsolve.sun.com/search/document.do?assetkey=1-26-102215-1 Solution Type Sun Alert Solution 200448 : Security Vulnerability With The "/usr/ucb/ps" Command Impact A security vulnerability in the "/usr/ucb/ps" (see ps(1B)) command may allow unprivileged local users the ability to see environment variables and their values for processes which belong to other users.
519 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 16:35:03 ] >>517 そりゃ、不適当なこと言っちゃダメだろ
520 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 21:49:36 ] security.bsd.see_other_uids=0 で良いのでは無いか? 他のOSの事は知らないけど。
521 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/31(月) 22:12:21 ] >>516 おいおい、自分の厨房っぷりを隠そうと嘘を嘘で上塗するのか? 続きに「極端にインセキュアと考えなければならなくて、使用すべきでない」と 書いてあるじゃないか。 それとも本物の中学生か? 英語読めるようになってから出直しておいで。 Section 4.2.2.2, 懼Using Option Files懼, discusses option files in more detail. Store your password in the MYSQL_PWD environment variable. This method of specifying your MySQL password must be considered extremely insecure and should not be used. Some versions of ps include an option to display the environment of running processes. If you set MYSQL_PWD, your password is exposed to any other user who runs ps. Even on systems without such a version of ps, it is unwise to assume that there are no other methods by which users can examine process environments. See Section 2.14, 懼Environment Variables懼.
522 名前:名無しさん@お腹いっぱい。 [2008/03/31(月) 23:48:17 ] 文字化けしてるな。>>516 はさすがに逃亡だろうな。だから恥ずかしいなら黙っていろと... 環境変数でパスワード渡していいのは小学生までという結論でいいか? dev.mysql.com/doc/refman/6.0/en/password-security.html Store your password in the MYSQL_PWD environment variable. This method of specifying your MySQL password must be considered extremely insecure and should not be used. Some versions of ps include an option to display the environment of running processes. If you set MYSQL_PWD, your password is exposed to any other user who runs ps. Even on systems without such a version of ps, it is unwise to assume that there are no other methods by which users can examine process environments. See Section 2.14, "Environment Variables".
523 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/01(火) 00:14:26 ] mysql*についてはmy.cnfに書いとけ、そして600にしとけ、でいいんでは?
524 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/01(火) 00:31:31 ] psで環境変数が他人にばれるOSってどれ?
525 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/01(火) 00:51:39 ] >>524 KKCに匹敵する恥晒しといてまだ粘着してるの? 恥ずかしいなら黙っていればいいのに。 > Even on systems without such a version of ps, it is unwise to assume that there are > no other methods by which users can examine process environments. たとえ、そのようなpsが無いシステム上でも、ユーザーがプロセスの環境変数を調べる他の方法が 無いと仮定するのは賢くありません。
526 名前:488 mailto:sage [2008/04/01(火) 02:06:50 ] ・パスワードをファイルに保存してそれを引数に与える とのことですが、 password.txt にpasswordを入力して mysqldump -u root -p < password.txt をしてみましたが、うまく動きませんでした。 なんとなくリダイレクト(の逆?)の使い方を間違っている気はします。 特にmysqldumpに限らず、 -pオプションが使えるその他のコマンドなどでも 共通で使えるセキュアな方法を取りたいのですが、 具体的にどんな記述にすればよかとでしょうか?
527 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/01(火) 04:02:15 ] つ >>523
528 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/01(火) 07:27:08 ] >>524 >>518 が言ってる通りSolarisだろな。patchも割りと最近のものだし。 そう頻繁にpatch当てられない環境とか、あえて古いバージョンのまま使わなければ ならない環境とかありそうだし、古いpsは結構残っているのでは。
529 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/01(火) 07:36:05 ] ucbにあるやつでは一番使うコマンドだな。
530 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/01(火) 10:02:05 ] >>526 通常、パスワードは/dev/ttyをオープンしてそこから読むので、リダイレクトしても駄目。 他のコマンドでも共通で使えるセキュアな方法はexpect(もしくはそれに類する、擬似端末 から流し込める)コマンド。 >>528 自称セキュリティ研究者の厨房が騒ぎ立てるまでは、環境変数が読めるのが仕様だった。 今でも*BSDは厨房の戯言として相手にしていない。 こんな基本的なことも知らないのが複数人いるはず無いので、自演の可能性9割だな。 自演までして恥ずかしくないの? しかもpsだけの問題じゃないという事も指摘されてるのに、恥ずかしいなら引っ込んでなよ。
531 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/01(火) 13:05:06 ] >>530 つ >>523 すでに別の最適解が示されてるのに、話戻して expectはないだろw 流れ欲嫁。
532 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/01(火) 13:14:32 ] >>530 FreeBSDでは ps e で、自分以外のプロセスの環境変数は表示しないようになってるよ。 嘘書くんじゃない。
533 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/01(火) 13:15:56 ] >>531 恥ずかしいなら黙ってればいいのに。 my.cnfはその他のコマンドで共通に使えるのか? >>526 > -pオプションが使えるその他のコマンドなどでも > 共通で使えるセキュアな方法を取りたいのですが、
534 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/01(火) 13:17:32 ] >>533 >>490 >expect以外のよい方法ってないでしょうか?
535 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/01(火) 13:42:07 ] FreeBSDのpsが自分以外の環境変数を表示してたのは前世紀の話。変更は1999年。
536 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/01(火) 14:07:07 ] 「恥ずかしいなら引っ込んでなよ」が口癖の >>530 氏の発言録: (ps が他人のプロセスの環境変数を表示してしまう問題について) >自称セキュリティ研究者の厨房が騒ぎ立てるまでは、環境変数が読めるのが仕様だった。 >今でも*BSDは厨房の戯言として相手にしていない。 要約すると、 「*BSDでは、psで他人のプロセスの環境変数を表示できても、それは仕様であって それを問題視するのは自称セキュリティ研究者の戯言。 今でも*BSDではpsで他人のプロセスの環境変数を表示できる」 恥ずかしいですかwww
537 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/01(火) 14:13:09 ] >>530 は取り下げよう。俺は恥は知っているからな。
538 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/01(火) 14:26:28 ] >>536 この人にとっての今はだいたい10年前と思うと辻褄が合う気がする。 >>537 > psだけの問題じゃない も取り下げということでいいのか? psのsetuidを落とすのがworkaroundということは普通に考えれば ps固有の問題ということになると思うのだが。 違うなら違うでいいので具体例を出すなりして立証してくれ。 まさか引用した箇所にそう書いてあるからそうなんだとか言わんよな。
539 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/01(火) 14:30:05 ] psがsetuidで動作していたのっていつの時代? それも10年前かw
540 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/01(火) 14:55:01 ] 平ユーザが ps e で他ユーザの環境変数が見えない OS でも、 実行したのが root なのであれば見えるでしょ。 別ホストで動いている mysql に接続しようとしていて、 そのホストの root がその mysql の権限を持ってないのであれば、 mysql のパスワードは root に知られちゃマズいわけで、 やっぱり環境変数でパスワードを渡すのはよろしくない。 もっとも、それをいったら chmod 600 my.cnf も同じだけどな。
541 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/01(火) 14:58:03 ] >>538 > psだけの問題じゃない これはmysqlが言っていること、 www.google.com/codesearch?q=%2Fdev%2Fkmem&hl=en&btnG=Search+Code これらが安全だと示してくれればオレは取り下げる。もしくは「環境変数は安全」という仕様でもよい。
542 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/01(火) 15:02:51 ] >>541 > オレは取り下げる というのは「オレが(も)主張する」が前提だよな。当然その立証が先。
543 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/01(火) 15:05:17 ] 途中で送ってしまった。 >>541 > オレは取り下げる というのは「オレが(も)主張する」が前提だよな。当然その立証が先。 それができなきゃ取り下げざるを得ないのであって、安全だと示してくれれば などと条件をつけられる立場ではない。
544 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/01(火) 18:32:47 ] >>543 話そらすなよ。 名無しのお前が環境変数は安全だと主張している。 mysqlの公式ドキュメントは安全だと考えていない。 権威の無いお前が安全だと立証しろ。
545 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/01(火) 23:15:20 ] >>540 rootが信用できないマシンに重要な情報を置くな。 (環境変数以前の問題でしょ?)
546 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 01:32:52 ] >>539 かなり昔前からkmemグループによる管理だぞ。 もう20年近く立っているはず。 最近/procがいい加減なことが多いが。
547 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 06:59:36 ] >>546 psがkmemグループ(setgid)で動作していたのっていつの時代? それも10年前かw
548 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 08:12:22 ] >>544 自分で証明できないものだから権威とやらに頼るとは、まさしくこれだな >>538 > まさか引用した箇所にそう書いてあるからそうなんだとか言わんよな。 話をそらしているというか露骨に逃げてるのは君の方だ。 この議論において根拠を提示できないなら意味がない。 恥を知っているというのは口先だけだったな。
549 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 11:12:51 ] >>548 多くの人がレビューした文書と、名無しのお前の主張じゃぶっちぎりでお前のほうが信憑性が低い。 お前が立証しろ。当たり前だ。
550 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 13:16:10 ] 議論というのは発言者が誰であれ根拠に基づいて行うのが当たり前。 勝負あったな。
551 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 13:33:58 ] つか本人が言ってたよね。 > 自称セキュリティ研究者の厨房が騒ぎ立てるまでは、環境変数が読めるのが仕様だった。 それが脆弱性としてアドバイザリまで出されてるってことは 今(10年前ではないw)は他人の環境変数は読めないのが仕様ってことでしょ。 違うというなら仕様として他人の環境変数読めるものを出してみろと。
552 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 13:36:36 ] psに限らず、が抜けてた。
553 名前:名無しさん@お腹いっぱい。 [2008/04/02(水) 15:17:59 ] 質問があります。 shまたは、bashで、makeのように、 2つのファイルを比較して、新しいファイルが生成されている 時だけ処理をしたいのですが、shellへの理解が足りない ためにうまく動かないので、教えてもらえると助かります。 こんな感じです。 do_iconv(){ echo "mv ${i} ${i}.old" echo "iconv -f euc-jp -t utf-8 < ${i}.old > ${i}" } for i in *.html if [ -e ${i}.old ] then if [[ ${i} -nt ${i}.old ]] then do_iconv fi else do_iconv fi done
554 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 15:31:28 ] >>553 > echo "iconv -f euc-jp -t utf-8 < ${i}.old > ${i}" した時点で、${i}の方が常に${i}.oldより新しくなるじゃないか。 本当は何がしたいんだ?
555 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 15:53:19 ] >>554 それより前に if [[ ${i} -nt ${i}.old ]] で比較してるだろ。 わからないなら黙ってろ。
556 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 15:54:56 ] >>553 for i in *.html の次の行に do が抜けてる。
557 名前:553 mailto:sage [2008/04/02(水) 15:55:02 ] >> 554 本当は、上記に書いてますがシェルスクリプトでmake みたいなことがしたいです。 ちなみに、 >> echo "iconv -f euc-jp -t utf-8 < ${i}.old > ${i}" >した時点で、${i}の方が常に${i}.oldより新しくなるじゃないか。 で、ハッとして touch ${i}.old をiconvの後にしてみましたが 変わりません。 $ ls -la --time=ctime *.html -rw-r--r-- 1 foo bar 5388 2008-04-02 14:23 SandBox.html -rw-r--r-- 1 foo bar 4323 2008-04-02 14:06 Travel.html $ ls -la --time=ctime *.old -rw-r--r-- 1 foo bar 5374 2008-04-02 14:06 SandBox.html.old -rw-r--r-- 1 foo bar 3334 2008-04-02 14:06 Travel.html.old のようなときに、SandBox.htmlだけ iconv 処理をしたいのです。
558 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 15:56:54 ] >>553 とりあえずforにはdoつけろな。
559 名前:553 [2008/04/02(水) 15:58:24 ] >> 556 御指摘ども、本当のスクリプトには入れてます。 いまは要点だけ抜き出すと、下記のような感じにしています。 do_iconv(){ echo "mv ${i} ${i}.old" echo "iconv -f euc-jp -t utf-8 < ${i}.old > ${i}" echo "touch ${i}.old" } for i in *.html do if [ -e ${i}.old ] then if [[ ${i} -nt ${i}.old ]] then do_iconv fi else do_iconv fi done
560 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 16:01:10 ] >>557 おい、--time=ctime かよ。mtimeじゃなくて。 シェルの[[ ]] の -nt では、ctimeでの比較はできない。 mtimeのみ。 本当にctimeでやりたいんなら無理。
561 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 16:06:09 ] えっと、次は、 > うまく動かない の中身プリーズ。
562 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 16:06:49 ] >>561 >>560
563 名前:553 mailto:sage [2008/04/02(水) 16:22:10 ] >> 561 うまくいかないの、ココロは、意図は、SandBox.htmlだけ iconv したい のですが、プログラムは SandBox.html および Travel.html の 両方を iconv しようとします。 >> 560 ctimeはダメですか。リダイレクトでファイルを作るから、ctimeでないと ファイルの作成時刻を比較できないと思ってました。がーん、他の方法 を考えなくては
564 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 16:24:32 ] makeを使えばいいんじゃないか?
565 名前:553 mailto:sage [2008/04/02(水) 16:27:05 ] >> 564 はい。makeを使うことを考えます。 ありがとうございました>みなさん
566 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 16:31:00 ] >>564-565 アフォか。 makeだって mtimeで比較するよ。 ctimeでの比較が必須なら make使ったって問題は解決しない。 (ctimeの意味を誤解していて、実はmtimeでもOKなら話は別だが)
567 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 16:37:06 ] >>563 >リダイレクトでファイルを作るから、ctimeでないと >ファイルの作成時刻を比較できない ↑ は誤解してるようだね。 だとすると mtimeで比較して問題ないことになる。 とすると、>>559 のスクリプトでうまく動いているはず。 うまく動いているのに、>>557 で --time=ctime で見ているもんだから、 うまく動いていないと思い込んでいるだけ、というオチ。
568 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 16:39:24 ] 汚いシェル関数だなぁ。echo消せ。引数使え。
569 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 16:50:19 ] [ ] と [[ ]] が同居するスクリプトを初めて見た。どっちかに統一しろよ。 [ ] の方推奨だが。 testの -nt は純正シェルでは使えない。 ${i} なんて書くくらいなら "$i" って書け。 { } 付けただけじゃスペース入りファイル名とかの問題回避できないぞ。
570 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 17:28:49 ] 純正シェル(笑)
571 名前:553 [2008/04/02(水) 17:52:14 ] >> 567 誤解してました。 >> 568 shell関数まで添削してもらえるとは恐縮です。 >> 569 ありがとう。[[ ]]ではなく[ ] を使います。 あと、"$i"の記法はshellの本を注意深く読んだらちゃんと書いてありました。 下記のように直して、実行したら意図どおりに動いてます。m(_"_)m ========================================== #/bin/bash -x do_iconv(){ mv $1 "$1".old /usr/bin/iconv -f euc-jp -t utf-8 < "$1".old > $1 touch "$1".old } for i in *.html do if [ -e "$i".old ] then if [ "$i" -nt "$i".old ] then do_iconv "$i" fi else do_iconv "$i" fi done ======================================
572 名前:553 mailto:sage [2008/04/02(水) 17:52:54 ] bash -x の実行例 + for i in '*.html' + '[' -e SandBox.html.old ']' + '[' SandBox.html -nt SandBox.html.old ']' + do_iconv SandBox.html + mv SandBox.html SandBox.html.old + /usr/bin/iconv -f euc-jp -t utf-8 + touch SandBox.html.old + for i in '*.html' + '[' -e Travel.html.old ']' + '[' Travel.html -nt Travel.html.old ']' + for i in '*.html'
573 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 19:12:56 ] >>554 の言うように、 "$i".oldの方を編集しない限り、 必ず"$i"の方が新しいのに、(iconvの結果) > if [ "$i" -nt "$i".old ] してる。逆に"$i".oldを編集したら何も行われない。 仕様を日本語で書いたらどうか? たぶん.iconvedを作って、 "$i"と時間比較して新しいものだけiconv、 最後に必ずtouch .iconved、 これでやりたいことに合うんじゃないか?
574 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 19:43:56 ] >>573 その問題は、 >>557 >touch ${i}.old をiconvの後にしてみましたが ↑ で解決済。 というか、>>571 で、「実行したら意図どおりに動いてます。」 ですべて解決済なんだから、これ以上言うことはない。
575 名前:名無しさん@お腹いっぱい。 [2008/04/02(水) 20:00:06 ] カレントディレクトリが /abc/def/ghi/jkl/mno/pqr/stu/ とフルパスであったときに一番最後の部分(stu)を取り出したいのですが どのように書けばよいのですか
576 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 20:18:40 ] basename /abc/def/ghi/jkl/mno/pqr/stu/
577 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 20:19:16 ] basename `pwd`
578 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 21:33:15 ] >>551 はいはい、それがお前が出した唯一の根拠ね。 で、それが何かの標準になってるのか? ところで、>>516 ので試みた捏造に関しての弁明はどうした?
579 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 21:49:00 ] まだやってんのかw
580 名前:sage [2008/04/05(土) 16:40:16 ] リナックス等の研究やってます。 www.ine.sie.dendai.ac.jp/homepage/ www.ine.sie.dendai.ac.jp/wiki/index.php?FrontPage
581 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/10(木) 07:37:45 ] シェルスクリプトから以下のようなテキストを呼びだして、 環境変数を展開した上で、位置変数に set したいのですが、 お知恵を拝借したく、どうかよろしくお願いします。 $ cat test.txt $HOME/doc/ いまは、シェルスクリプト内部で、 sed -e 's/\$HOME/$HOME/g' のようにしています。
582 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/10(木) 07:40:42 ] >>581 eval set `cat < test.txt`
583 名前:581 mailto:sage [2008/04/10(木) 08:20:51 ] >>582 どうもありがとうございます! eval を使ってもう一度、$HOMEを変数展開をするのですね。 独力では全く思いつきませんでした。 本当にありがとうございました。
584 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/10(木) 08:25:30 ] >>582 catが無駄です。
585 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/10(木) 08:28:30 ] >>584 catなしでどう書くの?
586 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/10(木) 08:29:07 ] eval set `< test.txt`
587 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/10(木) 09:30:12 ] はいはい。bash依存。