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/
417 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/26(水) 14:51:14 ] これでどうだ。ポータブルだろw #!/bin/sh my_date() { echo 'main(t,b){t=time(0)+'$1';strftime(&b,16,"%Y%m%d%H%M%S\n",localtime(&t));printf(&b);}' | gcc -xc - 2>/dev/null ./a.out; rm a.out } n=$1 i=1 while [ "$i" -le "$2" ]; do my_date "$n" n=`expr "$n" + "$1"` i=`expr "$i" + 1` done
418 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/26(水) 14:56:56 ] おしいな。 gccのところがccなら。
419 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/26(水) 15:01:06 ] >>418 ccにすると、「language optional software package not installed」って出て 動かないOSがあるから、gccの方がポータブル。 ~
420 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/26(水) 16:48:33 ] strftimeのない昔のUNIXは切り捨て?
421 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/26(水) 16:55:18 ] strftime()使わずに、struct tmの中身を直接printf()すればいいかな。
422 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/26(水) 17:27:15 ] コード長くなっちゃうなぁ。 テストしやすいように、$1 $2 はデフォルトを入れるようにしておいた。 #!/bin/sh my_date() { echo ' #include <time.h> main(){struct tm *t;int i;i=time(0)+'$1';t=localtime(&i); printf("%04d%02d%02d%02d%02d%02d\n", t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);} ' | gcc -xc - 2>/dev/null ./a.out; rm a.out } set ${1-5} ${2-3} n=$1 i=1 while [ "$i" -le "$2" ]; do my_date "$n" n=`expr "$n" + "$1"` i=`expr "$i" + 1` done
423 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/26(水) 17:47:31 ] ネタひっぱりすぎ
424 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/28(金) 00:31:20 ] 日付関係はperlでやらないか。結構古くても入ってるでしょ、perl。
425 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/28(金) 03:21:18 ] 誰かshell scriptでDateTimeライブラリ書け。
426 名前:401 [2008/03/28(金) 05:18:13 ] できました。 ありがとう。 ひっぱって悪いですが>401の内容で 20080322123456FreeBSD 20080322123456NetBSD 20080322123456OpenBSD のように第3引数を「FreeBSD」のようにしてファイル名に付けたい です。 自分でやってみましたが touch `date +%Y%m%d%H%M%S -d "$n second" `$3 とか d=date +%Y%m%d%H%M%S -d "$n second" f=$d$3 touch `echo $f` としますが invalid argumentなど出ます。 この場合は、どうしたらいいですか。 gnu dateですた
427 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/28(金) 06:54:01 ] >>426 > touch `date +%Y%m%d%H%M%S -d "$n second" `$3 ここで date がエラーを吐いているのなら n に値を代入し忘れている可能性が高い。 まず $n の値を確認しろ。
428 名前:401 [2008/03/28(金) 07:10:23 ] すみません。 家で、今確認しました。 >>426で touch `date +%Y%m%d%H%M%S -d "$n second" `$3 と書きましたが。 touch `date +%Y%m%d%H%M%S -d "$n second" $3` のようにしてエラーが出ていました。 $3の前後に「`」を移動する いま、>>426のようにしたら意図通りできました。 会社でもやってみます。 すんませーーーん
429 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/28(金) 08:12:00 ] ここに来てる人、OSはUNIXだよね? (FreeBSDとかSolarisとか) GNU dateって、わざわざインストールしてるの? まさか犬じゃないよね?
430 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/28(金) 09:45:54 ] してる。 GNU testも、gwakも。 犬がどうしたとかそんな馬鹿な偏見はないから。
431 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/28(金) 11:59:03 ] >>429 FreeBSDはUNIXなの?
432 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/28(金) 12:25:21 ] FreeBSD=unixで良いじゃん。 別に定義の話をしてるわけじゃなし。
433 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/28(金) 12:33:51 ] FreeBSDをUNIXに含めるんであれば Linuxを含めない理由ないでしょ。
434 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/28(金) 12:55:21 ] LinuxはLinux板という専用の隔離板があるので、 そちらに行けば良いと思います。
435 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/28(金) 13:36:03 ] そうなればそうなるわな
436 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/28(金) 15:15:13 ] UNIX でも通用するポータブルなスクリプトを知りたいならここだと思ってた。
437 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/28(金) 15:43:48 ] じゃあ GNU date使っちゃ駄目じゃん。
438 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 02:50:31 ] AIX4ばっかりの仕事の俺に愛の手を!GNU系でもインストールなんて許されてねぇ
439 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 04:06:52 ] Cもだめってこと?
440 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 10:57:42 ] --prefix=$HOMEで入れちまえ、とかなんとか。 でもコンパイラも入ってなかったりするのさ。
441 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 11:19:10 ] というわけでGNU date必須の回答を出して悦に入るのは恥知らず。
442 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 11:19:14 ] だったらいまあるものでなんとかすればいいじゃない
443 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 11:21:33 ] 今回の場合、GNU以外のdateでは不可能。
444 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 13:18:57 ] dateというファイル名でperlで組めばお題は満足する。 安易に不可能とか言い切って恥ずかしくないの?
445 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 13:30:29 ] 一時、awkが有料のUNIXあったよな。
446 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 13:33:30 ] >>444 perlを使ったらシェルスクリプトじゃない。 perlが非標準のUNIXもある。
447 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 13:36:23 ] perlが入っていればそれでいいけどねー
448 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 13:45:27 ] >>446 おまえの脳内定義の「シェルスクリプト」で使用可能なコマンドを列挙しろ。 そしてそれ以外は認めないというスレを立ててそっちに行け。
449 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 13:52:40 ] >>444 じゃあ、perl使ってGNU dateそっくりのスクリプト書いてみろよ。 どうせそれもできないのに知ったかで言ってるんだろ。
450 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 13:53:09 ] まあ当該質問の環境でperlが使えるかは未知数だから…
451 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 14:07:54 ] autoconfが生成するconfigureって移植性は相当意識してるらしいね。 autoconfの本(紙の)読んだらいろいろクドクドかいてあった。
452 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 14:08:44 ] GNU dateの互換である必要は全く無い。 こんな単純な事に気付かなくて恥ずかしくないの?
453 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 14:17:19 ] 問題はそこじゃないから
454 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 14:30:54 ] うん、 > GNU date必須の回答を出して悦に入るのは恥知らず。 これに尽きるね。
455 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 15:03:37 ] >>452 GNU dateの互換である必要ないから、 回答例を1例でも挙げてみろよ。まだ1例も挙げてないじゃないか。 やっぱり知ったかなんだろ?
456 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 15:41:56 ] 別解を提示する事と > GNU date必須の回答を出して悦に入るのは恥知らず。 は、独立という事に気付かないって恥ずかしくないの?
457 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 16:00:12 ] なんだ、やっぱり解答できないんだ。
458 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 16:49:25 ] 恥の上塗りしないで引っ込んでりゃいいのに。
459 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 18:30:19 ] GNU date が優秀なのは分かったから それを使わないポータブルでエレガントな別解プリーズ
460 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 18:54:53 ] Perlだとこうか($nに秒単位の差分をいれてね) perl -MPOSIX -le "print POSIX::strftime(q{%Y%m%d%H%M%S}, localtime($n+time))" これは未検証だがどうだろうか date -r $(expr $(date +%s) + $n) +%Y%m%d%H%M%S
461 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 18:58:27 ] POSIX dateには-uしかなかったからこれはポータブルじゃないね 次の人お願い
462 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 19:13:48 ] 彼によるとGNU date以外の回答はシェルスクリプトじゃ無くなるようですよ。 何しろそれ以外の解は存在しないらしいですから。
463 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 19:14:47 ] >>462 糞粘着しねよ
464 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 19:41:47 ] ようやく恥というものがわかったのか?
465 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 21:11:30 ] 正直dateとかどうでもいいよw いつまで続けんのw
466 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 21:50:26 ] もうテンプレにLinux禁止、GNUコマンド禁止って入れとけよ
467 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 22:04:49 ] じゃあ、perlもGNUモノだから禁止ですね。
468 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 22:13:41 ] >>467 ?
469 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 22:14:53 ] 恥ずかしいなら黙ってればいいのに。
470 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 22:16:35 ] perlはGPLであってGNUじゃないでしょ? # Artistic Licenseも選択できる。
471 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 22:24:54 ] perlはもともとスレ違いだから禁止。 ときどき空気読まずにperlでの解答する香具師居るが、単にスレ違いが見過ごされているだけ。
472 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 23:27:53 ] 質問者の環境で動けばそれでいいじゃない。
473 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 23:30:34 ] >>445 BSD拡張が有料だった時代もあったなあ。
474 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 23:37:41 ] >>439 Cもダメ。C必須のアプリを入れるならOKだけれど!かなしい!
475 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 23:40:00 ] >>472 そうだね
476 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/29(土) 23:43:06 ] >>474 つ ハンドコンパイル
477 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/30(日) 00:10:24 ] >>476 それだ! よく考えたら、適当な環境でクロスコンパイルすればいいのか
478 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/30(日) 00:11:22 ] 風紀委員がうるさいから禁止事項にはしないほうが良い。
479 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/30(日) 00:41:27 ] 質問者の環境で動けばどうでもいいよ
480 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/30(日) 03:56:12 ] 既に遠い過去の>>428 で解決しててな
481 名前:名無しさん@お腹いっぱい。 [2008/03/30(日) 03:58:09 ] >>441 くだらん事書いて、刺された方が切れたんだろ? おまえ、第三者から見て、評論家だけで役にたって無い気がするぞ。 空気悪くなってんだから、少し考えてはどうですか?
482 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/30(日) 09:01:53 ] 恥ずかしいなら黙ってればいいのに。 > 自称被害者
483 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/30(日) 19:01:21 ] 自覚なしに恥の上塗りをするのは勝手
484 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/30(日) 20:43:35 ] svn help|sed -n '/^ \([a-z]\+\) \?.*/{s//\1/p}' の出力をリストとして処理するんですが 改行をデリミタとして分解すると分解後のリストの中に""のような空の要素ができてしまいます echoの-nオプションのように最終行の改行を出力しないようにする方法を教えてください 現在は分解する前に部分文字列を作る関数でsubstring(0, str.length())のようにして取り除いてます
485 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/30(日) 21:22:52 ] >>484 コマンド置換で一旦変数に取り込めば最後の改行はカットされるけどな。 変数の値を参照する時も echo -n で参照。 hoge=`svn help|sed -n '/^ \([a-z]\+\) \?.*/{s//\1/p}'` echo -n "$hoge"
486 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/30(日) 21:53:57 ] どうもありがとうございました なんかのソースに付いてるようなスクリプトでわざわざ代入しているのにはこういう理由もあったんですね
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 ] 裏も取らずにテキトーなこと言うやつが多過ぎるな。