トップページunix
1001コメント351KB

シェルスクリプト総合 その16

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。2010/02/20(土) 14:10:05
シェルスクリプトの総合スレです。 
スクリプトのお勉強・自慢・腕試しなどにどうぞ。 
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。 

□お約束 
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。 
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。 
 Linuxユーザは/bin/shの正体がbashなので特に注意。 
 FreeBSDユーザは/bin/shの正体がashなので注意。 
 v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。 
  http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sh/ ;
  http://heirloom.sourceforge.net/sh.html ;
・csh/tcshのシェルスクリプトは推奨されません。 
 (理由は「csh-whynot」でググれ) 
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。 
 manや参考リンクを見ましょう。 
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。 
・シェルスクリプトのことをシェルってゆーな 
・シェルで使えるワイルドカード等は正規表現ではありません。 
 正規表現の話題はスレ違い(正規表現スレへ) 

□初心者へのアドバイス: 
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも 
 RubyやPerlの方が適した仕事には素直にそちらを使いましょう。 
・知らないコマンドが出てきたらmanを引きましょう。 
・思い通りに動かないときは、まずは sh -x でトレースしましょう。 

前スレ 
シェルスクリプト総合 その15
http://pc12.2ch.net/test/read.cgi/unix/1246408968/l50
0473名無しさん@お腹いっぱい。2010/06/05(土) 01:33:35
質問です。
以下のソースでは入力がhogeかそれ以外の文字列の場合は期待通りに動くんですが、文字列を入力しなかった場合は
line 6: [: =: unary operator expected
とエラーが出ます。これはどうやれば防げますか?

#! /bin/sh

echo "input? "
read i

if [ $i = "hoge" ];
then
 echo "input is 'hoge'"
else
 echo "other"
fi
0474名無しさん@お腹いっぱい。2010/06/05(土) 01:37:47
"$i"
0475名無しさん@お腹いっぱい。2010/06/05(土) 01:51:39
>>474
なんという…ありがとうございます。
0476名無しさん@お腹いっぱい。2010/06/15(火) 23:04:34
1ヶ月の最初の日曜日を表示させるには・・・・・・
なんかいいコマンドありますか?

find /var/www/data -name hoge を毎月1回最初の日曜日に実行して
インデックス作りたいんす
0477名無しさん@お腹いっぱい。2010/06/15(火) 23:16:56
cronで日曜に起動して日付が7以下かどうか調べれば?
逆でもいいけど。
0478名無しさん@お腹いっぱい。2010/06/15(火) 23:32:49
0 0 1-7 * * [ "$(date +%a)" == "Sunday" ] && command -args

こうですか?
0479名無しさん@お腹いっぱい。2010/06/15(火) 23:41:12
>>476
date -d `date +%d`' days ago 1 day next sunday'


>>477
それをやりたくないから質問してるんだろ
0480名無しさん@お腹いっぱい。2010/06/15(火) 23:43:36
>>477 その発想はいいですね、考え付きませんでした
>>479 days ago ですか!date は奥が深いですね

いろいろとありがとうございますたー!
0481名無しさん@お腹いっぱい。2010/06/15(火) 23:49:22
>>476
これじゃだめ?
cal ${month} ${year} | awk '/^ ?[0-9]+{print $1}' | head -1
0482名無しさん@お腹いっぱい。2010/06/15(火) 23:56:07
>>481 ありがd >>479 と at を使って何とかなりますたたた

cal って便利なんだけど awkで整形して使うのは面白い技ですね
みなさんいろいろ技があるんですね、勉強になります

そろそろCも覚えなきゃなぁ
やることいっぱいですorz
0483名無しさん@お腹いっぱい。2010/06/16(水) 00:06:52
>>479
こんな環境もある
% date -d `date +%d`' days ago 1 day next sunday'
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
[-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format]
%
0484名無しさん@お腹いっぱい。2010/06/16(水) 00:19:06
おお〜 環境依存ですか

>>483 これ空鼠?
0485名無しさん@お腹いっぱい。2010/06/16(水) 00:28:20
>>484
いあ FreeBSD. つか, *BSD 全部だと思う.
つか, GNU 拡張 date じゃないと通らへんちゃう?
0486名無しさん@お腹いっぱい。2010/06/16(水) 00:34:31
days ago なんて知らないと思ったら拡張date だったのですか
うちのCentOSでは動いてしまったので気付かなかったw
あとで会社のFreeBSDで試して見ます(ヲ
0487名無しさん@お腹いっぱい。2010/06/17(木) 03:26:50
FONに入れたOpenWrtからTwitterに投稿したいためだけに
シェルスクリプトでOAuth認証できるクライアントを書いたw
Perlとか入れなくても標準環境にopensslとcurl入れるだけで動くからいいわ
0488名無しさん@お腹いっぱい。2010/06/18(金) 00:25:21
BSDだったら-vの組み合わせで何とか出来そうですね。手元に環境ないから
試せないけど。
0489名無しさん@お腹いっぱい。2010/06/18(金) 18:29:26
これ見てよ↓
http://livedoor.2.blogimg.jp/agomesu/imgs/5/8/58ff257e.jpg
ばらまこうぜ!
0490名無しさん@お腹いっぱい。2010/06/20(日) 04:42:59
ubuntuでifconfig eth0のMACアドレスを":"を"-"に変えてMACアドレスのみ表示したいのですがどのようにすればよいでしょうか?
初歩的な質問で申し訳ありません。
0491名無しさん@お腹いっぱい。2010/06/20(日) 07:14:26
>>490
シェルスクリプト総合@LINUX Part5
http://pc11.2ch.net/test/read.cgi/linux/1238764663/

怒られる前に早く逃げろ
0492名無しさん@お腹いっぱい。2010/06/20(日) 10:03:33
>>490

ifconfig eth0 | sed -n '/.*HWaddr /{s///; s/:/-/gp}'
0493名無しさん@お腹いっぱい。2010/06/20(日) 14:58:13
ありがとうございました。
Linux板で聞くよりこっちで聞く方が早いですね。
0494名無しさん@お腹いっぱい。2010/06/20(日) 23:49:41
> 421 :名無しの報告 :2010/06/18(金) 18:37:13 ID:wsULoapS0
> おいちゃんこれお願い
>
> http://pc12.2ch.net/test/read.cgi/unix/1266642605/489 2010/06/18 18:29:26
>
> 422 :名無しの報告 :2010/06/18(金) 18:39:13 ID:9cXOXF/h0
> >>421
> 100618 危険!!外国人参政権画像マルチポスト報告 3
> http://qb5.2ch.net/test/read.cgi/sec2chd/1276851966/
>
> これだろここに直接持ってくるなよ
>
> 423 :名無しの報告 :2010/06/18(金) 18:39:51 ID:DZt17tze0
> >>421
> 削除人?じゃないならやめなさい
>
> 424 :名無しの報告 :2010/06/18(金) 18:40:07 ID:wsULoapS0
> はーい
> ごめんなさい
0495名無しさん@お腹いっぱい。2010/06/21(月) 21:28:31
2ちゃんに自動的に書き込むようなスクリプトは既出ですか
nc辺りで書こうかと思うのだけど
0496名無しさん@お腹いっぱい。2010/06/21(月) 22:30:52
>>495
根性試しでないならcurlとか使えばいいんじゃね?

0497名無しさん@お腹いっぱい。2010/06/21(月) 22:34:18
やっぱ/dev/tcp(笑)だろ
0498名無しさん@お腹いっぱい。2010/06/21(月) 22:56:57
>>495
Age2ch Part14
http://pc12.2ch.net/test/read.cgi/software/1118219419/
0499名無しさん@お腹いっぱい。2010/06/27(日) 01:04:50
wc -lで行数求める場合って、なんで先頭にタブ(空白かも)が入るんだろうね。
おかげで、-eqで比較しようとしてもちゃんと比較できなかったりして困るんだよね。
0500名無しさん@お腹いっぱい。2010/06/27(日) 01:29:20
>>499
awk '{print $1}' とかで切り出せば余分な空白は無くなる。

0501名無しさん@お腹いっぱい。2010/06/27(日) 01:57:41
$ test ' 0' -eq 0 && echo EQ
EQ
0502名無しさん@お腹いっぱい。2010/06/27(日) 08:45:20
>>499
GNU wc は、wc -l とか wc -c とかの時、余分な行頭スペースは入らない。
0503名無しさん@お腹いっぱい。2010/06/27(日) 09:17:16
>>500
awkなんか使わなくても、
[ `wc -l < file` -eq 123 ]
でいいだろ。
"`wc -l .. `" じゃなくて単に `wc -l ...` にする。

>>501
シェル依存。
$ test ' 0' -eq 0 && echo EQ
test: 0: bad number
0504名無しさん@お腹いっぱい。2010/06/27(日) 18:16:27
初歩的な質問だと思うんですが
bashでテキストファイルで空欄があるところを改行に変換するシェルスクリプトを作りたいんですが
どうすればよいでしょうか?
0505名無しさん@お腹いっぱい。2010/06/27(日) 19:18:38
まず服を脱ぎます
0506名無しさん@お腹いっぱい。2010/06/27(日) 19:26:54
>>504
man tr
0507名無しさん@お腹いっぱい。2010/06/27(日) 19:57:24
#!/bin/bash

man tr < file.txt

ってやってみましたが、動作が変です。
0508名無しさん@お腹いっぱい。2010/06/27(日) 20:23:38
いいから man tr しなよ。
0509名無しさん@お腹いっぱい。2010/06/27(日) 20:25:31
こうですかぁ??

----
#!/bin/bash

いいから man tr < file.txt
----
0510名無しさん@お腹いっぱい。2010/06/27(日) 20:34:58
粘着キチガイ犬はこのスレにも粘着してるのか?
0511名無しさん@お腹いっぱい。2010/06/27(日) 23:28:39
相手すんな。
0512>>4992010/06/29(火) 01:20:15
>>503
thanks.

0513名無しさん@お腹いっぱい。2010/07/27(火) 03:09:25
初歩的なものですみません。

#!/bin/bash
hostname
$hostname = `hostname`
echo $hostname

上記のシェルスクリプトを実行すると
hostnameだけの行はしっかり標準出力にホスト名が表示されるのですが、
$hostname = `hostname`で command not foundと怒られてしまいます。
なぜでしょうか・・・?
0514名無しさん@お腹いっぱい。2010/07/27(火) 03:19:29
すみません・・・。
#!/bin/bash

hostname
hostname = `hostname`
echo $hostname

でした。結果が
=
とだけ表示されてしまいます。標準出力の結果が変数に入っていないのでしょうか
0515名無しさん@お腹いっぱい。2010/07/27(火) 03:23:09
hostname=`hostname`
0516名無しさん@お腹いっぱい。2010/07/27(火) 03:27:38
>>515
ありがとうございます。解決しました。
いろいろやってたら、間違ってhostnameに=を設定してしまっていたことも重なっておりました。
0517名無しさん@お腹いっぱい。2010/07/27(火) 13:02:18
nxt .. g@foo.txt r@ n@bar.txt .
0518名無しさん@お腹いっぱい。2010/07/28(水) 21:03:26
xargsの-Pオプションってありますよね。
マルチコアの上で動かすときに重宝しています。

しかし、例えば
for i in *.jpeg
do
convert $i `basename $i .jpeg`.png
done
のような多少複雑な操作をxargs -Pのような形で簡単に並列実行することはできるでしょうか?
"args"だけでなくてリダイレクトにも使用できることを望んでいます。
# 普段はzsh使ってるので for i in *.jpeg; convert $i $i:r.png とか書いてますが

zargsのような、zshに依存するやり方でも構いません。
ご存知でしたら教えていただければ幸いです。
0519名無しさん@お腹いっぱい。2010/07/28(水) 21:09:45
>>518
単純にバックグラウンドで、

for i in *.jpeg
do
convert $i `basename $i .jpeg`.png &
done
wait

でいいんじゃないの。
それよりスペースや特殊記号入りファイル名の対応の方が気になる。
0520名無しさん@お腹いっぱい。2010/07/28(水) 21:28:09
それってファイルが何千とあったら醜い事にならんか?
0521名無しさん@お腹いっぱい。2010/07/28(水) 21:42:38
>>519-520
ありがとうございます。
変換する元のファイルも基本的に自分で作成するつもりなので、
ファイル名は「行儀のいい」ものと仮定して、スペースや特殊記号は特に意識していませんでした。

その代わり、ファイル数は100?のオーダーを考えているので、
バックグラウンドに全部一気に詰め込むのではなく、
最大並列プロセス数を与えて、その数だけ常に動かしつづけてくれる仕組みが欲しいのです。
0522名無しさん@お腹いっぱい。2010/07/28(水) 21:43:44
>>521
すみません、文字化けしてます。
×ファイル数は100?のオーダー
○、ファイル数は100 - 10000のオーダー
です。
05235182010/07/29(木) 13:56:52
とりあえず自己解決しました。
zsh依存ですが、例えば

function jpeg2png(); convert $1 $1:r.png
zargs -P4 -n1 -- $(echo *.jpeg|sed -e 's/ /\n/g') -- jpeg2png

とか。
ワンライナーで書きたかったのですが、これ以上にいいやり方ありますかね。
あと、$()の中が若干不細工ですが。
0524名無しさん@お腹いっぱい。2010/07/31(土) 10:29:17
コマンドラインのオプションはgetoptsで処理しますが、--を先頭に付けた
複数文字のオプションの処理はどのようにやるのが一般的なのでしょうか?
0525名無しさん@お腹いっぱい。2010/07/31(土) 11:28:10
誘導されてきました。

プログラムで質問があります。
/hoge/test/
の中に
1filename1.gif
1filename2.gif
2filename1.gif
2filename2.gif
があるとします。

# sh /hoge/test/*filename*
という感じにコマンドを入力すると
それらの複数のファイルが

command /hoge/test/1filename1.gif -option /aaa/bbb/1filename1.jpg
command /hoge/test/1filename2.gif -option /aaa/bbb/1filename2.jpg
command /hoge/test/2filename1.gif -option /aaa/bbb/2filename1.jpg
command /hoge/test/2filename2.gif -option /aaa/bbb/2filename2.jpg

って感じにファイルが無くなるまで全て、コマンドを実行したいのですが
どうすればいいのでしょうか??
0526名無しさん@お腹いっぱい。2010/07/31(土) 11:36:52
>>525
for f in "$@"
do
echo command "$f" -option "${f%%.gif}".jpg
done
05275242010/07/31(土) 12:29:25
自己解決しました。
0528名無しさん@お腹いっぱい。2010/07/31(土) 12:51:27
回答しようと思ったけど自己解決したようだからやめるね
0529名無しさん@お腹いっぱい。2010/07/31(土) 14:03:44
getopt_long
0530名無しさん@お腹いっぱい。2010/07/31(土) 14:07:36
それはC型言語
05315242010/07/31(土) 14:39:07
getoptに-lオプション付けて使うんですよね。
これって常識でしたか(笑)。
0532名無しさん@お腹いっぱい。2010/07/31(土) 14:42:34
でも、getoptを使うとスペース入りのファイル名がうまく扱えなくなる問題があるんだよね
05335242010/07/31(土) 14:48:53
-oオプションを付ければ良いようですよ。
それと$@なんかは"で囲う必要あり。
0534名無しさん@お腹いっぱい。2010/07/31(土) 14:52:31
BUGS
Arguments containing white space or embedded shell metacharacters
generally will not survive intact; this looks easy to fix but is not.
0535名無しさん@お腹いっぱい。2010/08/08(日) 20:39:19
質問です。

リスト化したファイルを読み込んでfind検索の後、圧縮かけて削除
処理させるスクリプト書いているのですが、どう書いて良いのか??

1)/home/hoge配下に、sample.lstと言うファイルを作成
2)(1)のリストを読み込んで、最終アクセスが7日経過しているファイルを検索
3)(2)に該当したものを圧縮して、元ファイルを削除する。

/*リスト化ファイル内*/
/home/aaa/abc
/home/bbb/abc

/* バックアップスクリプト*/
#!/bin/sh

BACKUPLIST=/home/hoge/sample.lst
FIND=`find $BACKUPLIST -type f -daystart -atime +7 `
tar cvzf `date +%Y%m%d`.tar.gz $TARGET && rm $TARGET

もちろん、上記では色々と問題がありますがこう言う風な処理をしたいと。
http://centossrv.com/backup.shtml ここの処理に、find検索の処理を追加
出来れば解決なのですが・・・。
0536名無しさん@お腹いっぱい。2010/08/08(日) 20:40:39
失礼、上記スクリプト内

FIND=`find $BACKUPLIST -type f -daystart -atime +7 `
tar cvzf `date +%Y%m%d`.tar.gz $FIND && rm $FIND

でした。
0537名無しさん@お腹いっぱい。2010/08/08(日) 20:57:36
>>535-536
find [パス] [検索条件] -exec tar -czf $(date +%Y%m%d).tar.gz {} + -delete -print
0538名無しさん@お腹いっぱい。2010/08/08(日) 21:06:51
-exec + でも、tarは複数回実行されうるんじゃ?
rやuじゃなくcで作ってるとはじめのほうのは失われてしまわないかね?

0539名無しさん@お腹いっぱい。2010/08/08(日) 21:14:59
>>538
ごめん、全然ダメだった
>>537実行すると超危険なので実行しないで!
まじでゴメン><
0540>>535-5362010/08/08(日) 21:17:11
>>537
アドバイス有難う。
でも、パスにfind $BACKUPLIST ・・・と書くとリストのパスを参照して
中身を参照検索してくれない。
単純にパスを指定すれば、うまくいくのだが???
find /home/aaa/abc ・・・で

>>538
findの所はループ処理だ回さないと駄目なのでしょうかね??

>>539
危ない、まだ実行していないので大丈夫wwww
0541名無しさん@お腹いっぱい。2010/08/08(日) 21:39:25
$BACKUPLISTの中身が/home/hoge/sample.lstなので
find /home/hoge/sample.lst ...が実行されちゃう
find $(< $BACKUPLIST) ...しないとダメだね
0542>>535-5362010/08/08(日) 21:52:07
>>541
レス有難う。
試しに、実行させたらとりあえず動いたんだが
tarの処理でエラーが出た・・・。

tar: 処理中にエラーが起きましたが、最後まで処理してからエラー終了させました

一応、圧縮は出来ているようだけど。

後、可能であればで良いのですが圧縮元を/home配下からではなく
abcフォルダ配下から圧縮出来ればベストなのですが。
一旦cdで/home/abcフォルダに移動しないとやっぱり駄目なのかな??
0543>>5352010/08/08(日) 22:09:46
少々問題が発生したけど、動いたのでスクリプトを整理します。

#!/bin/sh

BACKUPLIST=/home/genki/backup/sample.lst
FIND=`find $(<$BACKUPLIST) -type f -daystart -atime +7`
tar cvzf `date +%Y%m%d`.tar.gz $FIND && rm $FIND

tarの際、全角ペースが入っているファイルがエラーになってバックアップ
取れなかった以外は、ほぼ思っている処理が出来ました。

tar: ドキュメント.txt: stat 不能: そのようなファイルやディレクトリはありません
tar: 処理中にエラーが起きましたが、最後まで処理してからエラー終了させました

本来なら、新規 ドキュメント.txt と言うファイルがあるのだけど・・・。
0544名無しさん@お腹いっぱい。2010/08/08(日) 22:10:40
失礼、パスが間違ってた・・・・。

BACKUPLIST=/home/hoge/backup/sample.lst
0545名無しさん@お腹いっぱい。2010/08/08(日) 22:18:49
>>542-543
えっと、リストは絶対に必要なのかな?
スクリプト内に書いとくのでは駄目なのか
ファイルから読み込むとなると、どうしてもループさせることになるので色々と困るのだが…
>>543のように空白含むパス名の扱いにも問題が出る
BACKUPLIST内のディレクトリの数が数千とかじゃなければスクリプト内に書いたほうが楽

/home/abcってのはちょっとよく分からない
>>535では/home/aaa/abc、/home/bbb/abcの2つのディレクトリがあるようだけど
アーカイブを2つ作りたいってことなのかな
0546>>5432010/08/08(日) 22:42:51
>>545
なるべく、リスト内で処理したいです。
理由は、数千もディレクトリは無いにしろ数十・数百あるとかなり厳しいです。
後、スクリプト内を簡潔にしたいのもあります。
でも、>>545の言う通り数十・数百位のディレクトリならスクリプト内に
書いた方が楽なら、そちらの方がベスト!?なのかも・・・・。

確かに、両方abcとあるので分かりにくいので/home/aaa/test1と/home/bbb/test2
なら大丈夫ですかね??

/home/aaa/test1配下と/home/bbb/test2配下にあるものを1つのアーカイブで
まとめたいって事です。
0547名無しさん@お腹いっぱい。2010/08/08(日) 22:50:31
書いてみた

#!/bin/bash

# ${HOME}以下の相対パスを書く
l=("foo bar/" "hoge fuga/")

cd ~

mkfifo tmp.fifo
find "${l[@]}" -type f -daystart -atime '+7' \
-exec tar -cvzf $(date +%Y%m%d).tar.gz {} + -fprintf tmp.fifo '%P\n' &

while read f; do rm -f "${f}"; done <tmp.fifo

rm tmp.fifo

本当は素直にfindを2回かけて-exec tar、-deleteすればいいんだけど
条件に-atimeが入ってるので1回目と2回目のfindの結果が変わっちゃう
(findではatimeは変わらないけどtarすると変わるらしい)
なのでnamedpipeを作ってrmをwhileで回すという面倒臭いことをしてる
削除するファイルが増えればそれなりに遅くなるはず

誰かもっと良いやり方あれば教えてください
find一発で出来ないものか
0548名無しさん@お腹いっぱい。2010/08/08(日) 23:04:24
>>546
それじゃあ、ひと手間増えるけど

#!/bin/bash

backuplistfile="${HOME}/backuplist"
fifo="/tmp/backup.fifo"

while read p; do backuplist=("${backuplist[@]}" "${p}"); done <"${backuplistfile}"

cd /home

mkfifo "${fifo}"
find "${backuplist[@]}" -type f -exec tar -cvzf testbackup.tar.gz {} + -fprintf "${fifo}" '%P\n' &
while read f; do echo rm -f "${f}"; done <"${fifo}"
rm "${fifo}"

で、backuplistにはaaa/test1等と書いておけばいい
面倒だなぁ…俺てっきり>>537で行けると思ったのに
0549>>5462010/08/08(日) 23:06:18
>>547
スクリプトthx
とりあえず、なにかベストなやり方をもう少しググってみます。

他にもっとベストなやり方があればアドバイスよろしくお願いします。
0550名無しさん@お腹いっぱい。2010/08/08(日) 23:09:52
>>548
同じくスクリプトthxです。
明日ちょっと、実行させてみます。

結果はまた報告します。
0551名無しさん@お腹いっぱい。2010/08/08(日) 23:10:52
-fprintfの%Pは%pの間違いでした、ごめんちゃい
0552名無しさん@お腹いっぱい。2010/08/09(月) 14:34:41
cpio や pax でも tar 形式のアーカイブは作れるということは知っておいていいと思う。
0553名無しさん@お腹いっぱい。2010/08/09(月) 14:52:50
>>552
マジでっ!?
0554名無しさん@お腹いっぱい。2010/08/09(月) 17:37:58
bash の for xxx; do xxx; done のループで、
ループから脱出(break;) したり、次の周回に飛ぶ(continue;) には、
どうするのがよいのでしょうか。
0555名無しさん@お腹いっぱい。2010/08/09(月) 17:42:50
普通にCと同じようにbreakとcontinueが使えるよ
0556名無しさん@お腹いっぱい。2010/08/09(月) 17:43:43
>>554
自分で答え書いてるじゃん。
break とか continue とか実行すればいいだけ。
0557名無しさん@お腹いっぱい。2010/08/09(月) 18:17:38
むしろ一気breakが出来て便利だよな。
0558名無しさん@お腹いっぱい。2010/08/10(火) 17:09:38
起動時のスクリプト実行時に、USBの認識が間に合わないようなので、
mountの実行を5秒程度スクリプトのなかで遅らせたいんですが
どのようにすればよいですか?
0559名無しさん@お腹いっぱい。2010/08/10(火) 17:43:51
sleep 5
05605582010/08/10(火) 22:45:52
>559
どうもです
0561名無しさん@お腹いっぱい。2010/08/10(火) 23:18:19
>>558-560

起動スクリプトいじるような人がまじでsleep知らなかったの?
0562名無しさん@お腹いっぱい。2010/08/10(火) 23:29:09
GNOMEのエディターで編集やってたりして
0563名無しさん@お腹いっぱい。2010/08/11(水) 07:33:15
いいえ、サンバでメモ帳です
0564名無しさん@お腹いっぱい。2010/08/12(木) 07:22:26
>>561
起動スクリプトにsleepが入ってるのは良い設計ではない。
0565名無しさん@お腹いっぱい。2010/08/12(木) 07:34:16
>>564
まあ、RHELでもこんなもんだ:

$ grep sleep /etc/init.d/* | wc -l
37
0566名無しさん@お腹いっぱい。2010/08/12(木) 07:34:44
>>565
そりゃ、RHELだもん。
0567名無しさん@お腹いっぱい。2010/08/12(木) 07:42:15
ubuntuはSys V initを捨てたからここらへんは掃除されてるのかな? 
だれがgrepしてみて。
0568名無しさん@お腹いっぱい。2010/08/12(木) 07:45:06
>>565
それ、whileループ中で、あるコマンドを実行し、失敗した時のみ
sleepしてからリトライするという記述がメインなので、
通常時はsleepは実行されないし、問題ない書き方なんだよ。
0569名無しさん@お腹いっぱい。2010/08/12(木) 12:45:45
>>568
そう思うだろ?
実際見てみると、正常ルートなのに笑えるほど寝てるぜ。
0570名無しさん@お腹いっぱい。2010/08/12(木) 12:49:58
ウザス
0571名無しさん@お腹いっぱい。2010/08/12(木) 13:19:05
>>569
確認したけど、1番目の起動スクリプトが実行開始されてから
最後の起動スクリプトが終了するまでトータルで1秒未満なので、
sleepは1度も実行されてない。

OS起動時は、起動スクリプトの速度はネックになってなくて、
むしろ、カーネル自身のデバイス認識部分とかに時間がかかってる。
0572名無しさん@お腹いっぱい。2010/08/12(木) 16:30:34
>>571
[OK]
[OK]





が1秒以内に終わる・・・?超進化してるな。
0573名無しさん@お腹いっぱい。2010/08/12(木) 16:52:40
それよりも、rcスクリプトを捨ててSMFに改良したはずなのに、
未だに起動が激遅なSolarisを何とかしてください。
■ このスレッドは過去ログ倉庫に格納されています