回答編集履歴

2

説明追記

2017/11/12 03:15

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -1,4 +1,4 @@
1
- cdは「現在のプロセスの作業ディレクトリーを変更する」ものであって「サブプロセスで実行しても意味がない」ものの一つです。そのため、カレントディレクトリーを変更するようなプログラムを作ってそれをシェルから起動しても意図通りの動作にはなりません。
1
+ cdは「現在のプロセスの作業ディレクトリーを変更する」ものであって「サブプロセスで実行しても意味がない」ものの一つです。そのため、カレントディレクトリーを変更するようなプログラムを作ってそれをシェルから起動しても意図通りの動作にはなりません。そのため/bin/cdというコマンドは(あっても意味がないため)存在せず「No such file or directory」になるわけです。
2
2
 
3
3
 
4
4
 
@@ -7,3 +7,25 @@
7
7
 
8
8
 
9
9
  同様にexportなども、サブプロセスを起動してその中で環境変数の変更を行っても、プロセス起動物のプロセスの環境変数が変化するわけではないので、ビルトインコマンドとして実装されています。
10
+
11
+
12
+
13
+ ---
14
+
15
+ 追記:上記の話では以下の知識がないと理解が難しいかもと気づきました。
16
+
17
+ Cでexecutableファイル(a.outみたいなもの)を作ってシェルから呼び出す場合、次のように動きます。
18
+
19
+
20
+
21
+ (1) シェルは子供プロセスをfork()で生成する
22
+
23
+ (2) 生成された子供プロセスからexecv()で指定されたexecutableファイルを実行する
24
+
25
+
26
+
27
+ つまりexecutableファイルは常に起動元のシェルの子供プロセスで実行されており、子供プロセスで行った「プロセス固有の情報」の変更は親プロセスには影響しません。カレントディレクトリーはプロセス固有の情報ですのでexecutableファイルで変更しても親プロセスにはなんら影響を及ぼすことができないということです。
28
+
29
+
30
+
31
+ なんか・・・わかりにくい説明でスミマセン

1

表現訂正

2017/11/12 03:15

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -1,13 +1,9 @@
1
- cdは「現在のプロセスの作業ディレクトリーを変更する」ものであって「サブプロセスで実行しても意味がない」ものの一つです。
1
+ cdは「現在のプロセスの作業ディレクトリーを変更する」ものであって「サブプロセスで実行しても意味がない」ものの一つです。そのため、カレントディレクトリーを変更するようなプログラムを作ってそれをシェルから起動しても意図通りの動作にはなりません。
2
2
 
3
3
 
4
4
 
5
- よってシェルではcdはビルトインコマンドになっており、/binや/usr/binの下にある一般のコマンドのように「プロセスを生成してその中で動かす」のではなく実行中のシェルが直接処理います。
5
+ シェルcdはビルトインコマンドになっており、/binや/usr/binの下にある一般のコマンドのように「プロセスを生成してその中で動かす」のではなく実行中のシェルが直接chdirシステムコール呼び出して現在のプロセスのカレントディレクトリーを変更する実装になっています。
6
6
 
7
7
 
8
8
 
9
- カレントディレクトリーを変更するようなプログラムを作ったとしてもそれは意味のないものということになります。
10
-
11
-
12
-
13
- 、プログラム中で処理都合によりカレントディレクトリーを変するような場合ならfork/execveなどではなく直接システムールchdirを用るようにします。
9
+ 同様にexportどもサブプロセスを起動してその中で環境変数変更行っても、プロセス起動物のプロセスの環境数が変化するわけではないので、ビルトインマンドとして実装されています。