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

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

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。2009/01/29(木) 06:54:48
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。

前スレ落ちたみたいなのでリンク省略。
0671名無しさん@お腹いっぱい。2009/04/28(火) 22:16:41
>>669
v7sh
cdも外出し。
0672名無しさん@お腹いっぱい。2009/04/28(火) 22:29:15
>>669
誤判定されない方法を考えてみた。

for f in *;do case `(cd "$f") 2>&1` in *'Not a directory')echo "$f";;esac; done
0673名無しさん@お腹いっぱい。2009/04/28(火) 22:56:37
>>647
> もしかしてOpenSolarisにも入っているのだろうか・・・

入ってない。TODOリストに入っているが、
ライセンス関係で新たに作らないといけない。
CDE/Motifべったりだから誰もやらないだろう。

>>666
わざわざエミュレータで動かしてます。
「現存」してないです。とあなたは言うでしょうけど。
0674名無しさん@お腹いっぱい。2009/04/29(水) 01:06:42
648は満足したのかな。
0675名無しさん@お腹いっぱい。2009/04/29(水) 02:37:45
testの内部コマンド化は実用の観点ではぜひ必要だが
美しくないな。
なんてこと言う奴はrcを使えってことか
0676名無しさん@お腹いっぱい。2009/04/29(水) 05:58:40
>>664
> v7は「現存」しない。
うちでは fpga で作った pdp-11 互換 CPU 上で元気に動いてますけど
0677名無しさん@お腹いっぱい。2009/04/29(水) 05:59:43
> cdも外出し。
寝言は寝てから言ってね
0678名無しさん@お腹いっぱい。2009/04/29(水) 06:49:51
>>676
それを「現存しない」と言う。よく覚えとけ。
0679名無しさん@お腹いっぱい。2009/04/29(水) 06:55:31
Solarisでは cdは外出しだよ。
/usr/bin/cd コマンドが存在するし。

多分、親プロセスを chdir()するようなシステムコール? を呼んでる??
0680名無しさん@お腹いっぱい。2009/04/29(水) 08:08:58
>>679
それたしか、自分がcdするだけ、ってnopコマンドじゃなかった?
0681名無しさん@お腹いっぱい。2009/04/29(水) 08:30:53
いや、ちゃんとcdでディレクトリ変わるし、which cd で /usr/bin/cdって出るんだ。
0682名無しさん@お腹いっぱい。2009/04/29(水) 08:59:20
>>681
/usr/bin/cd fooとやると変わらないだろ。
/usr/bin/cd foo && cd fooでフェイルセイフなcdだ。
0683名無しさん@お腹いっぱい。2009/04/29(水) 09:09:49
>>682
> /usr/bin/cd foo && cd fooでフェイルセイフなcdだ。

それ、フェイルな場合 /usr/bin/cd の段階でフェイルして、
エラーメッセージも出てしまうから、ちっともフェイルセーフじゃない。
単に cd foo とやったのと何ら変わりない。
0684名無しさん@お腹いっぱい。2009/04/29(水) 09:28:49
>>679
> 多分、親プロセスを chdir()するようなシステムコール? を呼んでる??
そんなシステムコールあるわけねーだろw
0685名無しさん@お腹いっぱい。2009/04/29(水) 09:39:00
おれ、今OS自作してるけど、fork()の引数でSHARE_CWDをセットすると
子プロセスとカレントディレクトリを共有する仕様にしようと思ってる。
cdを外付けコマンドにしたシェルを実装するんだ。
0686名無しさん@お腹いっぱい。2009/04/29(水) 09:40:04
フラグ乙
0687名無しさん@お腹いっぱい。2009/04/29(水) 09:43:41
あと、SHARE_ENVとSHARE_FDもつければいい
0688名無しさん@お腹いっぱい。2009/04/29(水) 09:47:47
>>685
それ、cdのときだけSHARE_CWDをセットするんなら、cdだけ特別扱い変わらず?
0689名無しさん@お腹いっぱい。2009/04/29(水) 09:54:11
fork()じゃなくてclone()だろ
0690名無しさん@お腹いっぱい。2009/04/29(水) 11:02:21
我が家のアイデア料理の話は要らないから
既存のシェルスクリプトの話をしろよ
0691名無しさん@お腹いっぱい。2009/04/29(水) 15:12:02
シェルってコンピューター用語だよ。
貝料理のことじゃないよ。誰も料理の話はしていないよ。
0692名無しさん@お腹いっぱい。2009/04/29(水) 16:36:32
つまんね
0693名無しさん@お腹いっぱい。2009/04/29(水) 22:08:15
>>678
日本語が不自由な人か?
ちゃんと、未だにPDP-11互換CPU上でV7が動いているんだから
「現存しない」とは言わないと思うぞ
実際にV7が動いてるわけだから
0694名無しさん@お腹いっぱい。2009/04/29(水) 22:14:28
そんなこと言ったら、博物館で復刻動作してる物でも「現存する」ことになってしまう。

testやechoが外部になってるシェルの議論なんてしても無駄。
0695名無しさん@お腹いっぱい。2009/04/29(水) 22:20:02
V7はソース見るとあまりにスッキリしすぎ。
(shは伝説的変態だが)
実際使うとすぐ落ちるんじゃないか?
0696名無しさん@お腹いっぱい。2009/04/29(水) 22:24:31
>>694
現実に動作してるじゃん
それを使う機械の有無は別として
シーラカンスは現存してないものって言ってるのに等しい
0697名無しさん@お腹いっぱい。2009/04/29(水) 22:26:47
>>695
はあ?
普通に使ってますけど?
0698名無しさん@お腹いっぱい。2009/04/29(水) 22:29:24
このスレは、実際にシェルスクリプトを使って仕事をしている人同士の
情報交換なので、個人的な趣味で過去の機械を動かして満足してる人は
無理に話題に入ってこないでいただけるかな?
0699名無しさん@お腹いっぱい。2009/04/29(水) 22:46:36
なんで仕事している人に限定すんだよ
0700名無しさん@お腹いっぱい。2009/04/29(水) 23:49:38
いいレスなら空想家も歓迎。
0701名無しさん@お腹いっぱい。2009/04/30(木) 01:08:37
爺さんが使っているポンコツの話なんぞ、誰も聞きたくないんですよ。
いい加減にしてね(はーと)。
0702名無しさん@お腹いっぱい。2009/04/30(木) 01:10:34
>>701
じゃあ、ネタ振ってよ はーと
0703名無しさん@お腹いっぱい。2009/04/30(木) 11:45:55
>>698
> このスレは、実際にシェルスクリプトを使って仕事をしている人同士の情報交換
ダウト。
>>1には、お勉強・自慢・腕試しと明記されている。従って、趣味でシェルスクリプ
トを勉強している人もOKだろ。


0704名無しさん@お腹いっぱい。2009/04/30(木) 18:33:49
getoptとgetoptsってどっち使ってる?
0705名無しさん@お腹いっぱい。2009/04/30(木) 18:40:44
当然getopts

getoptは外出しの別物
0706名無しさん@お腹いっぱい。2009/04/30(木) 18:42:07
速度的にはビルトインのgetoptsのほうが速いのはわかるけど
オプションの処理なんてたかが知れてるし

その他の面でもgetoptsのほうがいいの?
0707名無しさん@お腹いっぱい。2009/04/30(木) 18:46:55
getoptって、スペース入りファイル名とか、ちゃんと処理できたっけ?
getoptsならもちろん無問題だけど。
0708名無しさん@お腹いっぱい。2009/05/02(土) 01:11:20
質問です。

以下のような形式のログ(MySQLのバイナリログみたいなもの)があるとします。
---------------------
09/04/01 12:00 aaa
09/04/01 13:10 aaa
          bbb
09/04/01 13:20 ccc
09/04/01 14:40 aaa
          ddd
          eee
          ccc
---------------------
このような形式のログから、例えば、13時台のログを抜き出すにはどうしたらいいでしょうか?
上記のログでいうと、以下のような結果がほしいです。
---------------------
09/04/01 13:10 aaa
          bbb
09/04/01 13:20 ccc
---------------------
awkとgrepを駆使すればできそうなのですが、いまいちわかりません。
よろしくご教示お願いします。
0709名無しさん@お腹いっぱい。2009/05/02(土) 02:24:32
>>708
aaa や bbb がスペースやTABで分割された複数の単語(bbb = xxx xxx ...)になることが無いなら

awk 'NF>2{if($2~/^13:[0-5][0-9]$/)f=1;else f=0}f==1' "ログファイル"

複数の単語になるが bbb = xxx 00:00 xxx ... みたいに2番目の要素が時刻形式になることが絶対無いなら

awk '$2~/^[0-9][0-9]:[0-9][0-9]$/{if($2~/^13:[0-5][0-9]$/)f=1;else f=0}f==1' "ログファイル"


でいけそうな気がする。手元に環境ないんで試せてないけど
0710名無しさん@お腹いっぱい。2009/05/02(土) 02:35:06
grepがいいんじゃない?
cat 2ch-708-20090501.data | grep "[0-9]\{2\}/[0-9]\{2\}/[0-9]\{2\} 13:"
冗長的に書くとこんな感じ
cat 2ch-708-20090501.data | grep "[0-9][0-9]/[0-9][0-9]/[0-9][0-9] 13:"

man grepを読んで、cat data | grep うんたらで正規表現を試すといいと思うよ
0711名無しさん@お腹いっぱい。2009/05/02(土) 04:37:38
それじゃ駄目
0712名無しさん@お腹いっぱい。2009/05/02(土) 06:34:29
すみませんが、詳しい方、実際に試して確認した方のみ回答をお願いします
0713名無しさん@お腹いっぱい。2009/05/02(土) 09:33:07
>>708
これはどう?
sed -n '/^[0-9]/h; x; /13:[0-5][0-9]/{x;p}' datafile

0714名無しさん@お腹いっぱい。2009/05/02(土) 09:44:16
>>709 で良いんじゃないの?
0715名無しさん@お腹いっぱい。2009/05/02(土) 10:01:29
>>708
どうせならシェルでやれ。内部コマンドだけがいいぞ。

#!/bin/sh
f=0
while IFS= read line
do
case $line in *' 13:'??' '*) f=1;; 0*) f=0;; esac
case $f in 1) echo "$line";; esac
done
0716名無しさん@お腹いっぱい。2009/05/02(土) 14:07:55
(´,_ゝ`)プッ
0717名無しさん@お腹いっぱい。2009/05/02(土) 15:35:40
フラグ使うのはダサいと思うよ
0718名無しさん@お腹いっぱい。2009/05/02(土) 15:45:29
>>717
元の質問読んでる?

この場合は処理が行内で完結せず、
状態をどこかに記憶しなければならないのでフラグは必須なんだが。

>>713 の sedでは、状態をホールドスペースに記憶して、
ホールドスペースある同じ文字列を毎回正規表現で比較し直すという、
フラグよりダサイことをやってる。
0719名無しさん@お腹いっぱい。2009/05/02(土) 15:57:25
>>715 をフラグなしでやるとこうかな。
whileループが2重になってしまうし、
条件判断や echo が複数箇所で必要になって余計わかりにくい。
>>715 のフラグ方式の方がいいな。


#!/bin/sh
while IFS= read line
do
case $line in
*' 13:'??' '*)
echo "$line"
while IFS= read line
do
case $line in *' 13:'??' '*);; 0*) break;; esac
echo "$line"
done;;
esac
done
0720名無しさん@お腹いっぱい。2009/05/03(日) 13:26:32
715=718=719 なのかね
>>718 はありえない。毎回正規表現で比較するコストなんてたいしたことない
0721名無しさん@お腹いっぱい。2009/05/03(日) 17:43:17
>>715
質問者はawkとgrepを駆使するつもりだったようなので

>どうせならシェルでやれ。内部コマンドだけがいいぞ。
と強制する必要はないんじゃない?理由もイミフだし。

内部コマンドで済ます事に拘ることで >>715 とワザワザ長ったらしくしながら
大きなアドバンテージがある訳でもなく、もし、aaa とかが "13:xx " や "xxx xxx xxx 13:xx xxx ..." とか有り得るなら
>>709 では問題にならないのに >>715(や>>719も) では上手くいかない事を説明してないし
07227212009/05/03(日) 17:47:09
× もし、aaa とかが "13:xx " や "xxx xxx xxx 13:xx xxx ..." とか有り得るなら
○ もし、aaa とか bbb とかが、 "13:xx " や "xxx xxx xxx 13:xx xxx ..." という値を取りうるなら
0723名無しさん@お腹いっぱい。2009/05/03(日) 21:03:55
教えて下さい。レンタル鯖でCRONにて過去Logを削除するためにshellを組みました。
昨晩、実行されたのですが・・・エラーになりました。何が悪いのでしょうか?

shell
----- ここから -----
#!/bin/sh
find ./public_html/hoge/dat/ -type f -atime +1 -exec rm {} \;
----- ここまで -----

エラーメッセージ
/virtual/hoge/public_html/hoge.sh: line 2:
: command not found
find: missing argument to `-exec'
0724名無しさん@お腹いっぱい。2009/05/03(日) 21:26:12
>>723
ぱっと見、怖いスクリプト書いてるな…
一般的な助言しとくと
 ・カレントディレクトリは明示的に指定しる。

 ・cron実行時のPATH環境はどうなってる?
  (要はfindとrmコマンドは、フルパスでなくても実行可能?)

 ・このスクリプトに実行権与えてる?
0725名無しさん@お腹いっぱい。2009/05/03(日) 21:57:18
>>724
ご指摘ありがとうございます。カレントは「具象化」します。
実行エラーの原因がわかりました。
改行コードが「CRLF」でした _| ̄|○ il||l
「LF」のみして正しく動作しました。
0726名無しさん@お腹いっぱい。2009/05/03(日) 22:45:14
>>724 ← 大はずれ(笑)
おおげさな「助言」が全く関係ないオチだったね。
エスパー失格。
0727名無しさん@お腹いっぱい。2009/05/03(日) 23:10:48
>>726
おまえ何様のつもり?
>>724の指摘内容は、cronでスクリプトが動かないときに
真っ先に疑うべき内容で、別に大げさな助言でもなかろうに。
善意で答えている人に対して失礼すぎ。
0728名無しさん@お腹いっぱい。2009/05/03(日) 23:37:25
>>727
指摘は当たらないと意味がない。

もっと >>723 の質問をよく見ろよ。問題の鍵はここにあるんだよ。
>>723 の 「find: missing argument to `-exec'」のエラーメッセージ。
これが大きな鍵だ。

試しに、
find . -exec echo {} ?^M
って実行してみると良い。^Mは、Ctrl-[V] + [M] の CR な。
find: missing argument to `-exec'
って出るだろ。

あと、>>723 の「: command not found」
これは、#!/bin/sh^M になってる時出るメッセージだ。

以上を知ってれば的確な答えはすぐに出せたはず。
0729名無しさん@お腹いっぱい。2009/05/04(月) 00:28:45
findコマンドで指定するオプションの順番って性能的に重要ですか?

たとえば、
find . -type f -name \*php

find . -name \*php -type f
は、実行速度に違いとかありますでしょうか?
0730名無しさん@お腹いっぱい。2009/05/04(月) 01:01:09
>>729
選択性の高いものを先に書いたほうが早い。
例えば比率的に「ファイル数:ディレクトリ数=9:1」で「*phpの数:*php以外の数=1:9」なら -name \*php を先に書いたほうが、90%の確率で -type f を評価する必要がなくなるので、逆に書くよりは高速になる可能性が高くなる。
要は、対象になるディレクトリの中身がどうなる傾向にあるかに拠る。
ただ、-type f単体の評価のほうが-nameより高速であろうから、単純に比率だけからでは一概には言えない。実際に計測して統計とるのが最善。
0731名無しさん@お腹いっぱい。2009/05/04(月) 01:01:14
ない
0732名無しさん@お腹いっぱい。2009/05/04(月) 06:14:41
オプションの並び変えただけで実行速度かわるわけねえだろ、ニャロメ!
>>730は釣り。
0733名無しさん@お腹いっぱい。2009/05/04(月) 09:02:34
エスパーすると、>>730 はfind の内部処理がオプションで指定した順番で
処理するつくりになってると思い込んでいるんだろう

そういう仮定(本人は仮定とは思ってない)が書かれないから、他人には
全く理解不能になってしまう。
0734名無しさん@お腹いっぱい。2009/05/04(月) 11:06:23
>>730ではないが、実行前に実行順を最適化する事は不可能に思える。
従って指定順に処理されると考えるのが普通。
>>733はエスパーしたいなら、エスパースレにいけ。放置された質問たまってるぞ。
0735名無しさん@お腹いっぱい。2009/05/04(月) 13:24:43
>>733
http://www.linux.or.jp/JM/html/GNU_findutils/man1/find.1.html
find は与えられたファイル名以下のディレクトリツリーを検索し、同じく与えられた評価式を左から右に向かって優先順位の高いものから評価する (演算子のセクションを見よ)。
評価式の結果が確定すると (and の左項が偽だったり、 or の左項が真だった場合など) 評価は終了し、引き続き次のファイル名が評価される。
0736名無しさん@お腹いっぱい。2009/05/04(月) 14:18:22
なるほど、演算式として評価してるのか
0737名無しさん@お腹いっぱい。2009/05/04(月) 14:45:25
勉強になってよかったな
0738名無しさん@お腹いっぱい。2009/05/04(月) 19:50:01
なるほどね(´・ω・`)
0739名無しさん@お腹いっぱい。2009/05/05(火) 00:38:14
えーと、結論としては、findのオプションの並びが変わっても、実行速度に変わりはないってことだよね?

違ったらごめんw
0740名無しさん@お腹いっぱい。2009/05/05(火) 06:57:49
変わったら変わる。
(変わらないケースもまれにある)
0741名無しさん@お腹いっぱい。2009/05/05(火) 22:31:34
>>729
どちらの言ってることが正しいか自分の環境でテストしてみたんだけど、
1回目のfindでは7秒かかってたのが、2回目以降では、0.5秒で検索できた。

これって、OSがfindの結果をキャッシュしてるってことかなぁ、、、

テストするために、そのキャッシュをクリアする方法ってある?

ご存知の方は教えてくださいm(_ _)m

0742名無しさん@お腹いっぱい。2009/05/05(火) 22:36:20
>>741
それ、find自体は関係なくて、OSのファイルシステム(またはブロックデバイス)の
キャッシュが効いてるのが原因。

キャッシュの影響をなくすひとつの方法は、
umountできるディレクトリなら、
findの直前に一旦umountして、mountして、その直後に1回だけfindを実行する。
次のfindの前にまたumount/mountする。ちょっと面倒だけど。
0743名無しさん@お腹いっぱい。2009/05/05(火) 22:36:22
>>741
time sh first.sh; time sh second.sh;time sh first.sh; time sh second.sh;time sh first.sh; time sh second.sh;
おれは、こうしゃうけどね
でも、キャッシュはしていないと思うけどね
0744名無しさん@お腹いっぱい。2009/05/05(火) 22:37:16
shutdown -r now
0745>>7412009/05/06(水) 00:17:08
>>742
>>743
勉強になるなぁ、、、
どうもありがとう!
0746名無しさん@お腹いっぱい。2009/05/06(水) 13:37:32
>>741
で、テスト結果は?
0747>>7412009/05/06(水) 23:56:33
テストの結果だ。
改行多すぎてはれないので、二回にわけてはるね。


■前提条件
~$ uname -r
5.4-RELEASE-p6
~$ find . -type f | wc -l
30374
~$ find . -type d | wc -l
1130
~$ find . -type l | wc -l
445
~$ find . -type f -name \*php | wc -l
137

■テストの手順
(1) time find . -type f -name \*php
(2) shutdown -p nowした後、マシン起動
(3) time find . -name \*php -type f
(4) shutdown -p nowした後、マシン起動
(5) time find . -name \*php -type f
(6) shutdown -p nowした後、マシン起動
(7) time find . -type f -name \*php
0748>>7412009/05/06(水) 23:57:41
残り。

■結果
(1)
real 0m7.697s
user 0m0.181s
sys 0m0.261s
(3)
real 0m7.205s
user 0m0.207s
sys 0m0.238s
(5)
real 0m7.229s
user 0m0.187s
sys 0m0.258s
(7)
real 0m8.164s
user 0m0.199s
sys 0m0.243s

find . -type f -name \*phpより、find . -name \*php -type fのようがはやい。

■結論
オプションの並びをかえると、実行速度はかわる

0749名無しさん@お腹いっぱい。2009/05/07(木) 01:03:51
おいおい・・・
0750名無しさん@お腹いっぱい。2009/05/07(木) 03:47:59
そりゃstat(2)が減るわけだから若干は速くなっておかしくないだろ
0751名無しさん@お腹いっぱい。2009/05/07(木) 04:25:05
>>747
> /dev/nullしろよ。
それじゃreal timeが表示の時間測ってることになるだろ。
0752名無しさん@お腹いっぱい。2009/05/07(木) 06:10:32
>>750
stat(2)は減らない。
1回のstat(2)で、ファイル名とファイルタイプは同時に得られるから。
0753名無しさん@お腹いっぱい。2009/05/07(木) 10:03:02
シェルスクリプトに変更を加えずに alias を有効にする方法はありますか?
GNU の ls や stat を使うように書かれたシェルスクリプトを実行するために、

alias ls='gls'
alias stat='gstat'

を設定した状態で実行したいんですが、シェルでセットしてもシェルスクリプト中では有効になりません。
0754名無しさん@お腹いっぱい。2009/05/07(木) 10:29:17
>>752
stat(2)でファイル名得られるってどういうOSですかあ?
0755名無しさん@お腹いっぱい。2009/05/07(木) 10:55:10
>>754
readdir()等でファイル名一覧が得られたあと、
-type f のオプションがあるかどうかにかかわらず、
findとしてはそのディレクトリのすべてのファイルについて
一旦 stat(2)を実行する。
(でないと、サブディレクトリかどうかとかの判断ができないから)
で、-type fオプションとかがあると、すでに実行済みの stat(2)の結果を
利用するから、stat(2)の実行回数は増えない。
0756名無しさん@お腹いっぱい。2009/05/07(木) 11:10:07
>>753
PATHの一番優先順位のところに自作のディレクトリでもつくって、通して、ls,statというファイル名をつくって
$ cat ls
#/bin/sh
gls $@
$ cat stat
#/bin/sh
gstat $@
みたいなことするんじゃないの?

即席なんでこういうのは、ダサ過ぎなのかもしれないけど
0757名無しさん@お腹いっぱい。2009/05/07(木) 11:45:08
>>755
> (でないと、サブディレクトリかどうかとかの判断ができないから)
ディレクトリの判定には、いきなりchdirしてみると言う方法も考えられるので却下。
0758名無しさん@お腹いっぱい。2009/05/07(木) 11:47:34
>>757
実際のfindではいきなりchdirはしないから却下
0759名無しさん@お腹いっぱい。2009/05/07(木) 11:48:26
>>753
bashがスクリプト中でalias使えるか知らないが、

#!/bin/bash
alias ls='gls'
alias stat='gstat'
. そのシェルスクリプト
0760名無しさん@お腹いっぱい。2009/05/07(木) 11:49:17
>>758
そのような実装のfindが無いことを証明出来るなら採用。
0761名無しさん@お腹いっぱい。2009/05/07(木) 11:51:39
>>760
いきなりchdirすると、それがディレクトリへのシンボリックリンクだった場合に困る。
(-followオプションを付けていないのにsymlinkをたどっては行けないから)

だからいきなりchdirする実装はあり得ない。
0762名無しさん@お腹いっぱい。2009/05/07(木) 12:29:24
無いことを証明することを相手に求めるの男の人って…
0763名無しさん@お腹いっぱい。2009/05/07(木) 12:35:53
証明された後で、無いことの証明は不可能と主張する男の人って…
0764名無しさん@お腹いっぱい。2009/05/07(木) 16:42:56
背理法...?
0765名無しさん@お腹いっぱい。2009/05/07(木) 18:24:10
はいーりはーいりふれ背理法ー
0766名無しさん@お腹いっぱい。2009/05/07(木) 18:24:38
アルプスの少女ハイリ
0767名無しさん@お腹いっぱい。2009/05/07(木) 18:53:47
海胆板はじじい板
ttp://www.youtube.com/watch?v=h2mnwAJJDxY
ttp://www.youtube.com/watch?v=bfEVoJhxPPE
0768名無しさん@お腹いっぱい。2009/05/07(木) 23:15:48
豆知識:
readdir()すると、
ファイル名とi-node番号だけじゃなくて、
struct direntの中でファイルタイプも返すUNIXがある。
e.g. FreeBSD
0769名無しさん@お腹いっぱい。2009/05/07(木) 23:20:14
FS依存
0770名無しさん@お腹いっぱい。2009/05/08(金) 04:01:23
>>768
お前ら、レベル高いな、、、
ぜんぜん、この話題ついていけねぇ、、、orz

どうやったら、そんな高いレベルになるのか教えてくれ。
何かお勧めの本とか。
0771名無しさん@お腹いっぱい。2009/05/08(金) 06:55:30
>>768
その場合はreaddir()だけでファイル名もファイルタイプも得られるから、
findの-nameや-type fの有無にかかわらず、結局stat(2)の回数は増えない、でFA?
■ このスレッドは過去ログ倉庫に格納されています