アカウント名:
パスワード:
環境変数ではなくて環境と言いたかっただけなんじゃないかと。
# sh組込みコマンドはすべて外部コマンドとしても実装しないとPosix不適合らしいぞ ## goto が外部コマンドだったり(いつの話だ)
いいっぱなしもナニなのでちょっと Google 様に聞いてみましたが、 どうやら本当らしいです [dbforums.com]。 が、POSIXの規格をみたわけではないんで確定的なことがいえません、ごめんなさい。
... で、必ずしも内部コマンドと同じ機能を外部コマンドとして実装しなければならない、 ということではないようです。 実際、cd のほかにも exec, set, ulimit, eval, . など、内部コマンドでしか実装できない コマンドはいろいろあるわけですし。
# うちの RHL には /usr/bin/cd はないので POSIX 互換ではないらしい :)
# おまけ: Google 様のご託宣をめくってみたら Tru64 UNIX の cd(1) らしい [uwm.edu] ものを発見。`Note' の表現に注意されたし。
POSIX では,ユーティリティ (コマンドとは呼ばない) に対していろいろ規定がありまして,その中に組込みユーティリティ (built-in utility) というのもございます. 組込みユーティリティには特殊 (special) と通常 (regular) との区別があり, 特殊は,組込みでしか実現できない,変数の処理やスクリプトの制御に関わるものです.具体的には,次の通り:
break : continue . eval exec exit export readonly return set shift times trap unset
通常の組込みユーティリティが,実行ファイル版も用意されているのは,exec システムコールの引数に渡せるようにするためです.(cd 等のように,組込みでないと意味のないようなものもありますが)
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
人生の大半の問題はスルー力で解決する -- スルー力研究専門家
ls (スコア:1)
余裕があるときは ls -l で。
たまにSL [linet.gr.jp]が横切っていくこともありますが。
Re:ls (スコア:0)
Re:ls (スコア:1, 参考になる)
手元の環境では、which cdとやっても見つからないと言われる。
SunOSでは、which cdとやると/bin/cdと出てくるようですが…。
Re:ls (スコア:2, 参考になる)
なぜなら、子プロセスから親プロセスの環境変数は変更できませんので。
SunOSの/usr/bin/cdはカレントディレクトリに設定できるかのチェックに使う [sun.com]とのことなので別物かと。
Re:ls (スコア:2, 参考になる)
>なぜなら、子プロセスから親プロセスの環境変数は変更できませんので。
環境変数がどうのこうのというより、それ以前の本質(?)的問題として、
cdは*shの「プロセスの状態」を変更するコマンドだから、built-inにしか出来ないわけですよね。
Uinxのアーキテクチャつーかやり方だと、プロセスの状態はそのプロセス自身にしか変えられない…
#OOP好きから見ると、その「能動的にしか動かない」っぷりが、時々使いにくく感じるので、G7
ソース全然思い出せませんが、たしかUnix創世期の話の中にも、
当初cdを外部コマンドとして実装しようとしたが旨くいかなくて、
少ししてbuilt-inじゃなきゃならんことに気付いて、そう直した、
みたいな話が出てきてたような記憶が、ほのかに有ります。なんだっけなアレは?…
Re:ls (スコア:1)
環境変数ではなくて環境と言いたかっただけなんじゃないかと。
# sh組込みコマンドはすべて外部コマンドとしても実装しないとPosix不適合らしいぞ
## goto が外部コマンドだったり(いつの話だ)
Re:ls (スコア:1)
Re:ls (スコア:1)
今回のcd(プロセス「の」状態の変更を命じるタイプ)の例で判るように、
あらゆる「コマンド」が外部コマンドとして実装されるのが合理的だとは限らないっすよね。
例えばcdを外部コマンドにしようと思ったら、少なくとも命令の影響範囲をプロセス壁越えさせなきゃならん。
それって凄く非Unix的な行為のような…
Posixの事情は俺は存じませんが、単純にというか一般的に
「すべて外部コマンドとしても実装しないとHogehoge不適合」というクダリだけを読むと、
hogehogeという仕様(規格)ってDQN仕様なのかな?と疑ってしまいます。
こういうのって得てして、規格制定(者)の浅慮だった、というオチが予測されるんで。
Posixだと(例外的に)大丈夫、なのかどうかは俺は存じません。
Re:ls (スコア:1)
いいっぱなしもナニなのでちょっと Google 様に聞いてみましたが、 どうやら本当らしいです [dbforums.com]。 が、POSIXの規格をみたわけではないんで確定的なことがいえません、ごめんなさい。
... で、必ずしも内部コマンドと同じ機能を外部コマンドとして実装しなければならない、 ということではないようです。 実際、cd のほかにも exec, set, ulimit, eval, . など、内部コマンドでしか実装できない コマンドはいろいろあるわけですし。
# うちの RHL には /usr/bin/cd はないので POSIX 互換ではないらしい :)
# おまけ: Google 様のご託宣をめくってみたら Tru64 UNIX の cd(1) らしい [uwm.edu] ものを発見。`Note' の表現に注意されたし。
Re:ls (スコア:1)
POSIX では,ユーティリティ (コマンドとは呼ばない) に対していろいろ規定がありまして,その中に組込みユーティリティ (built-in utility) というのもございます. 組込みユーティリティには特殊 (special) と通常 (regular) との区別があり, 特殊は,組込みでしか実現できない,変数の処理やスクリプトの制御に関わるものです.具体的には,次の通り:
break : continue . eval exec exit export readonly return set shift times trap unset
通常の組込みユーティリティが,実行ファイル版も用意されているのは,exec システムコールの引数に渡せるようにするためです.(cd 等のように,組込みでないと意味のないようなものもありますが)
Re:ls (スコア:0)
> 少ししてbuilt-inじゃなきゃならんことに気付いて、そう直した
これ [freebsd.org]
Re:ls (スコア:1)
> 1. もともと UNIX はマルチプロセスではなかった。
なるほど。当初は$cwdという情報は
ログインコンテキストかなんか(当時のUnixの姿を知らないので、はずしてたら御免)が持つデータだったんですね。
#以下、U言語 [esm.co.jp]ね。
#なお、5文字以上の「=」や「-」の繰り返しがスラドに拒絶されるようなので、オリジナルと違って見栄えが悪いですが4文字に詰めました。
====
ログインコンテキスト
----
- cwd: string
- ログインプロセス: pid_t
----
+ cd(new_cwd:string)
====
====
プロセス
----
- self: pid_t ###これが有ったかどうかは俺は存じません
----
====
で、
ログインコンテキスト---(1)プロセス #### 同時にはたかだか1つのインスタンスしか持てない
だったと。
cdは、ログインコンテキスト「の」状態を変えるような命令をログインコンテキストに投げるコマンド、
だったのでしょうね。
で、マルチプロセスになったら、上記のクラス図(^^;を
以下のようにリファクタリングする(実用上の)必要が有ったわけだけど、
(御大たちの頭をもってしても)その変更の必要性に「しばらく」気付かなかった、ってなところでしょうか。
プロセス---(1)ログインプロセス
プロセス---(*)プロセス #### プロセスの親子関係ね。
====
ログインコンテキスト
----
- ログインプロセス: pid_t
----
====
====
プロセス
----
- self: pid_t
- parent: pid_t
- cwd: string
----
+ cd(new_cwd:string)
====
こうして、プロセスのサブクラス(?)であるシェル類には、
build-inかつ「ユーザInteractiveな」cdコマンドが必要になったわけですね。
シェル以外の一般のプロセスにもinteractiveじゃないだけでchdir()が有るわけですよね。今は。
Re:ls (スコア:1)
(前半)
>で、
>ログインコンテキスト---(1)プロセス #### 同時にはたかだか1つのインスタンスしか持てない
>だったと。
(後半)
>プロセス---(1)ログインプロセス
>プロセス---(*)プロセス #### プロセスの親子関係ね。
げ!不等号まわりが壊滅してて、クラス間の関連の図が崩壊してる(T_T)
以下が正しい姿です。ええい。面倒だから全角使ってやる。
#ついでにCodeタグもつけてやる
(前半)
で、
ログインコンテキスト<C>---(1)プロセス #### 同時にはたかだか1つのインスタンスしか持てない
だったと。
(後半)
プロセス<|---ログインプロセス ###ふつうはシェル類を割り当てますね
ログインコンテキスト<C>---(1)ログインプロセス
プロセス<>---(*)プロセス #### プロセスの親子関係ね。
Re:ls (スコア:0)
そりゃま子が親の環境変数を変更できないのは真ですが…。
cdがshell外部コマンドとか言うよりはマシですけど。
Re:ls (スコア:1)
cd: aliased to set old="$cwd"; chdir !*
とか
cd: shell built-in command.
とか出ます。
なんだったかの覚えてないけど、/bin/cshと返すのもありました。
Re:cd (スコア:1)
SGI-IRIX(tcsh)では
% which cd
cd: shell built-in commands
と表示されます
Linuxでもzshに変更すると上のように表示されますね。
SunOSでもtcshにすると同様のようです。