トップページ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
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を何とかしてください。
0574名無しさん@お腹いっぱい。2010/08/12(木) 18:59:43
>>564
なぜだめなの?
0575名無しさん@お腹いっぱい。2010/08/12(木) 19:15:53
>>574
非同期処理の終了をタイミングで取る→機種依存
0576名無しさん@お腹いっぱい。2010/08/12(木) 19:27:44
>>575
単純にsleepで待ってるんじゃなくて、実際にはこういう処理だよ


while ! command
do
sleep 1
done

どこにも機種依存要素はないし、
この処理で sleep を外したらそれこそ busy loop で重くなる。
0577名無しさん@お腹いっぱい。2010/08/12(木) 19:34:39
>>576
>どこにも機種依存要素はないし

こいつアホ(AAry
0578名無しさん@お腹いっぱい。2010/08/12(木) 19:52:37
>>576
いや、これ最高にアホだろ。
0579名無しさん@お腹いっぱい。2010/08/12(木) 20:14:53
rcスクリプトなんて、そもそも環境依存するもんだろ
0580名無しさん@お腹いっぱい。2010/08/12(木) 20:26:06
>>579
ここで言う機種依存といのはハードウェア構成依存という事だろう。 
0581名無しさん@お腹いっぱい。2010/08/12(木) 20:50:29
>>580
それは分かってるんだが。
大量に同一用途のサーバー管理するんでもなきゃ、
わざわざ可搬性を考慮するのなんて、バカバカしいよ。
0582名無しさん@お腹いっぱい。2010/08/12(木) 21:19:44
>>581
ぜんぜんわかってねぇなw
0583名無しさん@お腹いっぱい。2010/08/12(木) 23:02:33
>>582
反論も出来ないならひっこんでろよ
0584名無しさん@お腹いっぱい。2010/08/12(木) 23:16:36
>>583
何イライラしてるんだよw
sleep同期君
0585名無しさん@お腹いっぱい。2010/08/13(金) 11:23:11
ハードウェア依存の問題を回避するためのworkarroundとしてsleep入れるんじゃないの?
別に問題ないと思うけど。
0586名無しさん@お腹いっぱい。2010/08/13(金) 12:03:28
アンチsleep君の主張はよくわからんな
そもそも非同期処理じゃないし…
0587名無しさん@お腹いっぱい。2010/08/13(金) 12:46:07
SMFやrcngのような同期をとる機構がないのがクソと言いたいのだろう。
0588名無しさん@お腹いっぱい。2010/08/13(金) 13:07:37
この文脈でなぜSMF?
あれはタイマ割り込み使って音源鳴らしてるだけだろ。
0589名無しさん@お腹いっぱい。2010/08/13(金) 13:08:45
この文脈でSMFと言ったら、Service Management Facilityに決ってんだろ。
0590名無しさん@お腹いっぱい。2010/08/13(金) 13:43:34
GNU sleepだと sleep 0.001 とかできるから、
SMF再生するシェルが書けそうだな。
0591名無しさん@お腹いっぱい。2010/08/13(金) 14:17:12
シェルってゆうな。クズ。
0592名無しさん@お腹いっぱい。2010/08/20(金) 19:16:35
Makefileのなかで、tarコマンドを使いたいんですが、うまくいきません
単純に
tar directry/faile.tar tergetdir/
としてみたんですが
0593名無しさん@お腹いっぱい。2010/08/20(金) 19:33:45
>>592
シェルと関係ない話は別スレでやれよ(Makefileとも関係ないし)

まあ、f と -C オプションが落ちてるのが原因だけどな。
0594名無しさん@お腹いっぱい。2010/08/20(金) 20:07:24
なんでこのスレ選んだんだw
0595名無しさん@お腹いっぱい。2010/08/20(金) 20:09:52
directry
faile
terget

英語初心者スレが適当だね
0596名無しさん@お腹いっぱい。2010/08/20(金) 20:37:55
まぁ、ファイル名は別にどうでもいいと思うが
オプションがないね
man tarオススメ
tar cf foo.tar bar
tar cfz foo.tar.gz bar
tar cfj foo.tar.bz2 bar
0597名無しさん@お腹いっぱい。2010/08/20(金) 21:11:10
tar作成じゃなくて、展開じゃないの?
05985922010/08/20(金) 21:29:35
すいません
tar xvfp directry/file.tar tergetdir/
でした
0599名無しさん@お腹いっぱい。2010/08/20(金) 21:36:30
Makefileにターゲットもなくいきなりtarコマンドを書いたと見た。
0600名無しさん@お腹いっぱい。2010/08/20(金) 22:12:32
>>598
だから、>>593 が言うように -C を付けろよ
06015922010/08/20(金) 22:26:50
>>600
やっとわかりました。どうも
0602名無しさん@お腹いっぱい。2010/08/22(日) 09:15:58
shine
0603名無しさん@お腹いっぱい。2010/08/22(日) 09:48:13
シャイン? 輝けって?
0604名無しさん@お腹いっぱい。2010/08/23(月) 22:07:15
OS:FreeBSD
passwd(1)をシェルスクリプトでバッチ的に流すにはどうすればいいのでしょうか。
2回聞かれるところとかが、どう書けばいいのかわかりません。
お願いします。
0605名無しさん@お腹いっぱい。2010/08/23(月) 22:13:46
>>604
標準ツールじゃないけど、expect使ってみるとか。
0606名無しさん@お腹いっぱい。2010/08/23(月) 22:26:36
>>604
chpasswdってBSDには無いの?
0607名無しさん@お腹いっぱい。2010/08/26(木) 14:17:56
pw コマンドで -h 0 とすると標準入力からパスワード読み込むよ。
0608シェルマスター2010/08/28(土) 00:16:37
シェルスクリプトをシステム管理に活かすなら、
お前らならどんなシェルスクリプトを作る?
0609名無しさん@お腹いっぱい。2010/08/28(土) 00:48:13
手作業でやってる作業のうち、繰り返しやるものを折りを見てスクリプト化してくだけ。
0610名無しさん@お腹いっぱい。2010/08/28(土) 03:14:39
起動時に毎回することを自動化
0611名無しさん@お腹いっぱい。2010/08/28(土) 12:19:38
ちょっとした単発のデータまとめとかの下処理用。
ログをcsvに整形してExcelのオートフィルタで分析とか。
0612名無しさん@お腹いっぱい。2010/09/01(水) 09:09:06
以下のようなシェルスクリプトを用いて1つの端末にタブで複数のプログラムを動かすってのをやってます。
ただ、これだとプログラムが終了したりするとタブが閉じちゃうので、終了した後でもまたそこから
コマンドが打てるように改変したいのですがどのようにやれば良いのでしょうか?

#!bin/sh

gnome-terminal \
--tab --working-directory=`pwd`/hoge/ -e "command" \
--tab --working-directory=`pwd`/foo/ -e "command" \
--tab --working-directory=`pwd`/bar -e "command" \


一応ググってみると

gnome-terminal -x bash -c "command1; command2; exec bash"

こんな表記を使うとその後もコマンドを受け付けるみたいなのですが、
上のスクリプトとの組み合わせ方が上手くいかず、タブが起動しなかったりプログラムが起動しなかったりします。


OSはUbuntuなのでシェルはbashになると思います。お願いします。
0613名無しさん@お腹いっぱい。2010/09/01(水) 09:34:17
>>612

gnome-terminal -e 'bash -c "command1; command2; exec bash"'
0614名無しさん@お腹いっぱい。2010/09/01(水) 17:51:34
複数のプロセスを切るときに、いちいちコマンドでひとつづつ切るのが面倒です。
そこで、シェルで一気にプロセスをきりたいのですが、どのように記述すればいいですか?
0615名無しさん@お腹いっぱい。2010/09/01(水) 18:06:22
zshなら kill -KILL {1..99999} みたいな?
たぶん argument list too long とかいわれるんで、分割いるけど。
0616名無しさん@お腹いっぱい。2010/09/01(水) 18:53:26
pkillとかか?
使えるかは環境によるけど。
0617名無しさん@お腹いっぱい。2010/09/01(水) 19:55:10
説明ぬけててすみません。
そうですpkillです。
であとシェルの種類はbashでやりたいんです。
んで流れ的には612のように、1つの端末にタブで複数のプログラムを動かします。
んで複数のプログラムのプロセスをシェルを実行するだけですべてを切りたいんです。
そのようなシェルを作るにはどうすればよいですか?
ちなみに環境はubuntu10.04です
0618名無しさん@お腹いっぱい。2010/09/01(水) 20:05:56
>>617 おまえ >>612 か?
>>613 には礼なしかよw >>613 はできたんだな?

だったら、pkill -HUP gnome-terminal とかすれば、
その gnome-terminal から派生したプロセスは(普通は)まとめて終了する。
ただし、個々のプロセス側でシグナルを無視してたり、
setsid()とかで別セッションを開始してる場合(デーモン類等)は
終了しないけど、これは仕方ない。
0619名無しさん@お腹いっぱい。2010/09/01(水) 20:30:05
シェル作っちゃう人だし
0620名無しさん@お腹いっぱい。2010/09/01(水) 23:06:53
killすることを「切る」って言うもんなん?
0621名無しさん@お腹いっぱい。2010/09/02(木) 00:01:55
うまい事言うなと思ったが単に変換エラーかもしれんなw
0622名無しさん@お腹いっぱい。2010/09/02(木) 07:31:04
>>619
>シェル作っちゃう人だし

えっ? ここの住人は自分でシェル作れないんですか?
ネットからのコピペ(+改変)専門ですか?
0623名無しさん@お腹いっぱい。2010/09/02(木) 08:46:53
シェルスクリプトスレだからね。
シェルスクリプトは書けるけど、シェル作れる奴なんてここにはいないよ。
0624名無しさん@お腹いっぱい。2010/09/02(木) 08:54:34
>>623
難しく考えずにまずは自分でシェル作ってみたら?
ハローワールドのシェルなんてたった2行で作れるよw
0625名無しさん@お腹いっぱい。2010/09/02(木) 08:55:03
ネタはいいから。
■ このスレッドは過去ログ倉庫に格納されています