回答編集履歴
1
コマンドの種類と PATH について補足。
answer
CHANGED
@@ -21,4 +21,70 @@
|
|
21
21
|
[takeyuki@localhost ~]$ chmod +x s.sh
|
22
22
|
[takeyuki@localhost ~]$ ./s.sh takeshi apples
|
23
23
|
takeshi likes apples.
|
24
|
-
```
|
24
|
+
```
|
25
|
+
|
26
|
+
---
|
27
|
+
追記1
|
28
|
+
|
29
|
+
他の方の回答を見て、ひとつ、いや二つ、思い出しました。
|
30
|
+
|
31
|
+
コマンド、とは何か、というのは自明ではないように思いますが、名前で呼びだして実行可能なプログラム、という感じでしょうか。
|
32
|
+
まあ、そういう定義だとすると、コマンドにはその実体が何かによっていくつかあります。
|
33
|
+
|
34
|
+
(1) シェルの組み込み関数(ビルトインコマンド): シェルの機能として提供しているシェル内部にコードが書いてあるコマンド:例 bash の echo (外部コマンドの echo もある)
|
35
|
+
```
|
36
|
+
[takeyuki@localhost ~]$ echo test
|
37
|
+
test
|
38
|
+
[takeyuki@localhost ~]$ type echo
|
39
|
+
echo はシェル組み込み関数です
|
40
|
+
```
|
41
|
+
|
42
|
+
(2) 外部コマンド:ファイルとして存在するプログラム。実行ファイル形式のものもあれば、shebang 付きのスクリプトファイルのこともある。
|
43
|
+
```
|
44
|
+
[takeyuki@localhost ~]$ date
|
45
|
+
2016年 2月 14日 日曜日 09:13:16 JST
|
46
|
+
[takeyuki@localhost ~]$ type date
|
47
|
+
date はハッシュされています (/usr/bin/date)
|
48
|
+
[takeyuki@localhost ~]$ file `which date`
|
49
|
+
/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
|
50
|
+
[takeyuki@localhost ~]$ echo -e '#!/bin/bash\ndate' > date && chmod +x date
|
51
|
+
[takeyuki@localhost ~]$ ./date
|
52
|
+
2016年 2月 14日 日曜日 09:18:51 JST
|
53
|
+
[takeyuki@localhost ~]$ file date
|
54
|
+
date: Bourne-Again shell script, ASCII text executable
|
55
|
+
```
|
56
|
+
|
57
|
+
上の例で `date` で呼び出しているのが実行形式ファイルのもの、`./date` で呼び出しているのがカレントディレクトリにあるスクリプトです。
|
58
|
+
|
59
|
+
(3) エイリアス:よく使うコマンドを短く呼べるようにしたり、いつもつけるコマンドラインオプションをまとめたりして、シェルに登録しておくもの
|
60
|
+
```
|
61
|
+
[takeyuki@localhost ~]$ alias myls='ls -alt'
|
62
|
+
[takeyuki@localhost ~]$ myls .emacs.d
|
63
|
+
合計 8
|
64
|
+
drwx------. 11 takeyuki warriors 4096 2月 14 09:18 ..
|
65
|
+
drwx------. 2 takeyuki warriors 4096 2月 13 15:07 auto-save-list
|
66
|
+
drwxr-xr-x. 4 takeyuki warriors 47 2月 12 11:48 elpa
|
67
|
+
drwx------. 4 takeyuki warriors 38 2月 12 11:48 .
|
68
|
+
[takeyuki@localhost ~]$ type myls
|
69
|
+
myls は `ls -alt' のエイリアスです
|
70
|
+
[takeyuki@localhost ~]$ type ls
|
71
|
+
ls は `ls --color=auto' のエイリアスです
|
72
|
+
```
|
73
|
+
|
74
|
+
(4) ユーザ定義関数:シェルに登録しておく、ユーザが定義した関数
|
75
|
+
```
|
76
|
+
[takeyuki@localhost ~]$ myfunc(){ ls -lt $1 | head -3; }
|
77
|
+
[takeyuki@localhost ~]$ myfunc /var/log
|
78
|
+
合計 3316
|
79
|
+
-rw-------. 1 root root 1529001 2月 14 09:21 messages
|
80
|
+
-rw-------. 1 root root 58849 2月 14 09:01 cron
|
81
|
+
[takeyuki@localhost ~]$ type myfunc
|
82
|
+
myfunc は関数です
|
83
|
+
myfunc ()
|
84
|
+
{
|
85
|
+
ls --color=auto -lt $1 | head -3
|
86
|
+
}
|
87
|
+
```
|
88
|
+
|
89
|
+
(1), (3), (4) は、実体としてはシェルの内部にあります。シェルの外のファイルシステム上にあるのは (2) ですが、このとき、明示的にパスを指定しなかった場合にはシェルの環境変数 `PATH` に列挙されたディレクトリの中を探します。
|
90
|
+
`./script-args.bash` と、先頭に `./` をつける必要があるのも、明示的にファイルの存在する場所を指定するためです。自分でよく使うスクリプトを `/home/takeyuki/bin` にまとめておき、これを `PATH` に含めておく、なんてこともやったりします。このようにしておいた上で先の `script-args.bash` を `/home/takeyuki/bin` においておけば、`script-args.bash` とするだけで起動できます。
|