回答編集履歴

1

コマンドの種類と PATH について補足。

2016/02/14 00:35

投稿

unau
unau

スコア2468

test CHANGED
@@ -45,3 +45,135 @@
45
45
  takeshi likes apples.
46
46
 
47
47
  ```
48
+
49
+
50
+
51
+ ---
52
+
53
+ 追記1
54
+
55
+
56
+
57
+ 他の方の回答を見て、ひとつ、いや二つ、思い出しました。
58
+
59
+
60
+
61
+ コマンド、とは何か、というのは自明ではないように思いますが、名前で呼びだして実行可能なプログラム、という感じでしょうか。
62
+
63
+ まあ、そういう定義だとすると、コマンドにはその実体が何かによっていくつかあります。
64
+
65
+
66
+
67
+ (1) シェルの組み込み関数(ビルトインコマンド): シェルの機能として提供しているシェル内部にコードが書いてあるコマンド:例 bash の echo (外部コマンドの echo もある)
68
+
69
+ ```
70
+
71
+ [takeyuki@localhost ~]$ echo test
72
+
73
+ test
74
+
75
+ [takeyuki@localhost ~]$ type echo
76
+
77
+ echo はシェル組み込み関数です
78
+
79
+ ```
80
+
81
+
82
+
83
+ (2) 外部コマンド:ファイルとして存在するプログラム。実行ファイル形式のものもあれば、shebang 付きのスクリプトファイルのこともある。
84
+
85
+ ```
86
+
87
+ [takeyuki@localhost ~]$ date
88
+
89
+ 2016年 2月 14日 日曜日 09:13:16 JST
90
+
91
+ [takeyuki@localhost ~]$ type date
92
+
93
+ date はハッシュされています (/usr/bin/date)
94
+
95
+ [takeyuki@localhost ~]$ file `which date`
96
+
97
+ /usr/bin/date: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=05e827b15d6bebd4fd4ddb6c3878f1f498cdc486, stripped
98
+
99
+ [takeyuki@localhost ~]$ echo -e '#!/bin/bash\ndate' > date && chmod +x date
100
+
101
+ [takeyuki@localhost ~]$ ./date
102
+
103
+ 2016年 2月 14日 日曜日 09:18:51 JST
104
+
105
+ [takeyuki@localhost ~]$ file date
106
+
107
+ date: Bourne-Again shell script, ASCII text executable
108
+
109
+ ```
110
+
111
+
112
+
113
+ 上の例で `date` で呼び出しているのが実行形式ファイルのもの、`./date` で呼び出しているのがカレントディレクトリにあるスクリプトです。
114
+
115
+
116
+
117
+ (3) エイリアス:よく使うコマンドを短く呼べるようにしたり、いつもつけるコマンドラインオプションをまとめたりして、シェルに登録しておくもの
118
+
119
+ ```
120
+
121
+ [takeyuki@localhost ~]$ alias myls='ls -alt'
122
+
123
+ [takeyuki@localhost ~]$ myls .emacs.d
124
+
125
+ 合計 8
126
+
127
+ drwx------. 11 takeyuki warriors 4096 2月 14 09:18 ..
128
+
129
+ drwx------. 2 takeyuki warriors 4096 2月 13 15:07 auto-save-list
130
+
131
+ drwxr-xr-x. 4 takeyuki warriors 47 2月 12 11:48 elpa
132
+
133
+ drwx------. 4 takeyuki warriors 38 2月 12 11:48 .
134
+
135
+ [takeyuki@localhost ~]$ type myls
136
+
137
+ myls は `ls -alt' のエイリアスです
138
+
139
+ [takeyuki@localhost ~]$ type ls
140
+
141
+ ls は `ls --color=auto' のエイリアスです
142
+
143
+ ```
144
+
145
+
146
+
147
+ (4) ユーザ定義関数:シェルに登録しておく、ユーザが定義した関数
148
+
149
+ ```
150
+
151
+ [takeyuki@localhost ~]$ myfunc(){ ls -lt $1 | head -3; }
152
+
153
+ [takeyuki@localhost ~]$ myfunc /var/log
154
+
155
+ 合計 3316
156
+
157
+ -rw-------. 1 root root 1529001 2月 14 09:21 messages
158
+
159
+ -rw-------. 1 root root 58849 2月 14 09:01 cron
160
+
161
+ [takeyuki@localhost ~]$ type myfunc
162
+
163
+ myfunc は関数です
164
+
165
+ myfunc ()
166
+
167
+ {
168
+
169
+ ls --color=auto -lt $1 | head -3
170
+
171
+ }
172
+
173
+ ```
174
+
175
+
176
+
177
+ (1), (3), (4) は、実体としてはシェルの内部にあります。シェルの外のファイルシステム上にあるのは (2) ですが、このとき、明示的にパスを指定しなかった場合にはシェルの環境変数 `PATH` に列挙されたディレクトリの中を探します。
178
+
179
+ `./script-args.bash` と、先頭に `./` をつける必要があるのも、明示的にファイルの存在する場所を指定するためです。自分でよく使うスクリプトを `/home/takeyuki/bin` にまとめておき、これを `PATH` に含めておく、なんてこともやったりします。このようにしておいた上で先の `script-args.bash` を `/home/takeyuki/bin` においておけば、`script-args.bash` とするだけで起動できます。