パスを指定してファイルを実行する
echo "hello world"
自分が実行したいファイルがあるときターミナルでパスを指定する。
$ ./hello // 相対パス
$ ~/document/hello // 絶対パス
よく実行するファイルは、毎回入力が大変なので、ファイル名を入力するだけでファイルを実行できるようにする。
ファイル名のままコマンドを実行する方法
$ mkdir ~/bin
ホームディレクトリにbinディレクトリを作る。ここにコマンドとなるファイルを置いていくこととする。
$ PATH=$PATH:~/bin
~/binのpathを通す。そうすることで、~/bin以下にあるファイル名でファイルを実行できるようになる。
$ echo $PATH
pathが通ってるかエコーで確認できる。
これで、bin以下に置かれたファイルは、どこでもファイル名だけで実行できるようになる。
$ hello
$ hello world
注意点
カレントディレクトリ(./)をPATHに入れてはいけない。カレントディレクトリに名前が同じファイルがあるとそれが意図せず実行されてしまうため。悪意のあるファイルであった場合、などリスクが高い。
仕組み
「コマンドファイルをパス付きで指定する」ということは、例えば「ls」コマンドならば「/bin/ls」と入力する、ということになります。しかし、よく使うコマンドを毎回パス付きで指定するのは非常に面倒です。
Linuxでは、「コマンドサーチパス(コマンド検索パス)に登録してあるディレクトリにあるファイルは、パス名を省略してよい」という決まりになっています。「パス」だけで、このコマンドサーチパスを指すこともあります。
コマンドサーチパスは、「PATH」という名前の「環境変数」に保存されています。環境変数は、コマンドを実行している環境、すなわちOS全体で参照できる変数ということです。“PATHという変数”の内容は、「echo $PATH」コマンドで確認できます。
ここで、コマンドのパス名指定について少し考えてみましょう。
「コマンドはファイルをパス名付きで指定しなくてはならない。ただし、PATHにあるものはパス名を省略できる」ということは、「パス名付きならば、PATHにない場所にあるコマンドでも実行できる」という意味にもなります。
例えば、「/tmp」というディレクトリにある「mycommand」という実行ファイルは、コマンドラインで「/tmp/mycommand」と指定することで実行できます。とにかく“パス付き”であればよいので、絶対パスでも、相対パスでも構いません。
優先順位
コマンドをパス名なしで実行すると、シェルは
(1)エイリアス
(2)ビルトインコマンド
(3)PATHに指定されたディレクトリ
の順に、該当するコマンドを探します。
確認方法
type コマンド
でエイリアスなのか、ビルトインかなどがわかるようになっている。
他の方法
その他の方法としては、エイリアスを通しても可能。