teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

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

2016/02/14 00:35

投稿

unau
unau

スコア2468

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` とするだけで起動できます。