[Gauche-devel-jp] Re: directory 作成時の mode

Back to archive index

Osamu NAKAMURA naka****@hasak*****
2004年 9月 1日 (水) 21:32:45 JST


中村@質問者です。
shiro さん、cut-sea さん、コメントありがとうございました。
(食事に行っている間に3本もいただいていて驚きました。^^)

At Wed, 01 Sep 2004 00:10:24 -1000 (HST),
Shiro Kawai wrote:
> >   (ついでに、make-directory* 等のアスタリスクはどういう
> >    関数の名前につけてあるものですか?)
> 
> '*' は let* からの連想で、動作が再帰的にネストするような
> イメージがある場合に私は使います。これも参考にどうぞ↓
なるほど。
let* の binding を再帰的とは認識できてなかったのですが、
スコープが多重になっていく、ということですね。
make-directory* は、途中の sub directory も作りながら
掘って行ってくれるところが、同じイメージと。

> http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Scheme%3a!%a4%c8%3f
あ、失礼しました。ここ、以前一度見てたのに、抜けてました。m_o_m

> > 2.そもそも、mode としてどういう数値を与えたらいいのか
> >   理解できてません。(情けなし)
> >   shell の環境設定で umask コマンドに与える数値とは
> >   別物ですよね? (16877 で、rdxr_xr_x になりました。)
> >   ”POSIXスタイルのパーミッションビットマスク”という
> >   ものを与えるのでしょうか?
> 
> はい。これはunixシステムプログラミングのドキュメントを
> 見てもらうしかないのですが、 stat(2), chmod(2), open(2)
> のmanpageで必要十分な情報が得られると思います。基本的にmodeに
> 渡す数値はそのままmkdir(2)に渡るので、システムのmkdir(2)の動作
> そのものです。
そのはずだと思って見たんですけれども、、、、
と、ここで、cut-sea さんのメールを眺めて、
  umask / mode って、8進数だったんだぁ!
ということに気付きました。^^;;;;;
3 bit づつで表現するんだからそりゃそうだろう、と言われると
返す言葉がありません。
なんで、16877 で、rdxr_xr_x になるんだ、と悩んでおりました。
gosh> (format #t "~a" (slot-ref (sys-stat "scm") 'mode))
16877#<undef>
gosh> (format #t "~o" (slot-ref (sys-stat "scm") 'mode))
40755#<undef>
gosh> (format #t "~o" (slot-ref (sys-stat "scm") 'perm))
755#<undef>
失礼致しました。

> > 3.umask を scope 毎に簡単に切替えられると嬉しいかも、
> >   と思っています。
> > 
> >   gosh の環境内に gosh が参照する umask を収めた変数
> >   があるとしたら、それを local に変更するとその scope でだけ
> >   local な umask が適用される、という使い方はできないでしょうか?
> 
> umaskはGaucheの機能ではなく、OSが提供する機能で、
> プロセスが持つ状態です。
はい、gosh がスクリプトを実行している際、そのプロセスの
状態として umask があるというのは一応理解していて、
その umask に対応する変数を gosh が持っていて、
ファイル生成の際には、その変数を参照して生成するファイルの
mode を設定するという動作だったりしたなら、local に
その変数を変更することで、作成ファイルの mode を
手軽に一時変更できるかな、と虫のいいことを思ってました。

> 従って、複数のスレッドが走っている場合に:
> 
> >   (define-syntax let-umask
> >     (syntax-rules ()
> >     ((_ (umask) proc1 ...)
> >      (let ((oldumask (sys-umask umask)))
> >         proc1
> >         ...
> >         (sys-umask oldumask)))
> >   ))
> 
> このようなマクロでumaskを変えた場合、そのumaskの変更は
> proc1... だけでなく、同時に走っているスレッド全てに
> 予測不可能な影響を与えてしまいます。
スレッドのことまでは考えてませんでしたが、継続手続を
持ってこの中にはいって、途中で継続手続を呼び出した場合等、
状態が戻らないのでよろしくない、と後で思ったりしてました。

スレッドのことは(も)よく知らないのですけれど、各スレッドの
umask の状態は、共通なのでしょうか。スレッドによって、umask を
変えたいということもありそうな気がしますけれども。

shell script だと、child process での umask 変更は
親には影響しないようですが、thread はまた状況が異なる?

umask 022
touch aaa
(umask 222 ; touch bbb)
touch ccc

~$ ls -la aaa bbb ccc
-rw-r--r--  1 naka  users  0 Sep  1 21:19 aaa
-r--r--r--  1 naka  users  0 Sep  1 21:19 bbb
-rw-r--r--  1 naka  users  0 Sep  1 21:19 ccc

(うーん、Gauche と直接関係ない、基礎知識の欠如の露出ですね。
 このへんは、また別途勉強します。) 

> なお、このように「あるコードの『実行期間中』はある状態になる」
> というのは動的スコープといいます。Schemeではletなんとかは
> 静的スコープに使い、動的スコープを作るものはwithなんとか、
> とすることが多いようです。エラーや継続によるフローの変更も
> 考慮に入れると、with-umaskはこんな感じになるでしょうか。
ありがとうございます。
dynamic-wind というのをまだ使ったことがないので、これから
よく読ませてもらいます。

> でも、実用性重視がGaucheの方針なので、まっとうなwith-umask
> があった方がよいという要望があれば標準ライブラリにバンドル
> するかもしれません。カレントディレクトリを一時的に変える
> with-cwdみたいのは欲しいと思ったこともありますし。
with-cwd も欲しいですー
directory tree の複製をファイルは symbolic link する安直ツールを
作ったんですが、sub directory の中のファイルを symlink するたびに
directory に出入りしていて、これなら sh script で sub shell を
使って書く方が安直かも(いや、基本的な作りが悪いんですけど)などと、
思ったりしてました。

> > ついでのついでなんですが、gosh のインタープリタで、行編集
> > や履歴を使うようにはできないでしょうか。
> > 通常は、emacs の shell mode で使ってますが、ふと、そこにある
> > terminal で立ち上げてしまって、悔しい思いをすることが時々。。
> 
> 一応、goshはスクリプト実行に必要無いものは極力内部には抱えない、
> という方針です。インタラクティブな実行時だけライブラリを読めば行編集が
> 使える、というふうに作れれば、つけるかもしれません。
libreadline かなにかと link するように、configure 時に指定
すると行編集が可能になる、とかなってればいいんでしょうかねぇ。
(って、なにも知らずに言ってます。無視してください。)

cut-sea さんのかかれてた readline の拡張ライブラリで gosh インタプリタ
に行編集機能を追加できるんでしたっけ。以前、ちょっとだけ試して
なんだかよく分からず、諦めてました。また、見てみます。

ありがとうございました。

-- 



Gauche-devel-jp メーリングリストの案内
Back to archive index