シェルスクリプトや他の言語で書いたコマンドをこれから何度も使うならば、そのコマンドへのパスを通しておきましょう。
パスを通すことによって、どのディレクトリからもそのコマンドをパス指定なしで実行することができます。
方法は簡単。置き場所を決めて、そこにパスを通すだけです。
この記事では、パスを通すことについての入門的な説明を書きます。
自分が作ったシェルスクリプトが実行できない
今、ここに自分で作成したシェルスクリプトがあるとしましょう。
シェルスクリプトに限らず、他の言語でもよいのですが、ここでは簡単にシェルスクリプトとしておきます。
1 2 3 4 5 6 7 8 9 10 | #!/bin/sh X=1 while [ $X -lt 10 ];do echo $X X=`expr $X + 1` done exit 0 |
10回のループで、1〜10までの数字を表示する簡単なスクリプトです。ファイル名をsample1.shとします。
これに、”chmod +x sample1.sh”で実行権限を与えたあと、
1 | $ ./sample1.sh |
と実行してみましょう。
これで問題なく実行できると思います。
しかし、
1 | $ sample1.sh |
とやったり、あるいは、別のディレクトリにいって、
1 | $ ./sample1.sh |
とやってみると、実行できずにエラーが表示されると思います。
これは、このコマンドに「パスが通されていない」からです。
このあたりの原因を説明します。
スポンサーリンク「パスを通す」とは?
「パスを通す」とは、実行したいコマンドがどこにあるかをシェルに知らせる手続きです。
普段、lsなどのコマンドを打つと、そのコマンドを実行してくれるわけですが、それらは基本的にパスが通っています。
例えば、lsというコマンドは、通常/binの下に置かれていますが、この/binはすでにパスが通されています。
後で説明しますが、試しに
1 | $ echo $PATH |
と実行してみてください。
環境によって出力が異なりますが、”:”(コロン)を区切り文字として、”/bin”という文字列が見つかると思います。
これが/binにパスが通った状態です。
さらに、試しに、
1 | $ echo $PATH= |
とやってみましょう。すると、
1 | bash: ls: そのようなファイルやディレクトリはありません |
と表示されるでしょう。
これはPATHという変数を空にしたことにより、「パスが通っていない状態」にしたからです。
このように、lsというコマンド1つとっても、パスが通っていないと、シェルがそのコマンドを見つけられず、実行ができない状態になるのです。
“/bin/ls” というように、コマンドの置き場所をつけて(つまりフルパスで書いて)実行することはできますが、これは不便ですね。
ただし、cdとかtypeといったコマンドは実はコマンドではなく、シェルの組み込み関数であり、これらはパスが通されているわけではありません。参考までに。
上記の実験をした後は、ややこしくなるので、そのウィンドウを閉じておきましょう。
環境変数PATHを設定する
先ほど書いたPATHという変数ですが、これは環境変数と呼ばれている変数です。
PATHという変数に、”:”(コロン)区切りでパスを書いておくと、シェルがコマンド実行時にそれらのパスを順に探しにいきます。
そしてコマンドが見つかったら、そのコマンドを実行してくれるわけです。
では、早速自分で作ったシェルスクリプトのパスを通してみましょう。
まず、自分で作ったシェルスクリプトの置き場所を決めます。
ここでは、ホームディレクトリの直下に”tools”というディレクトリを作り、ここに置くことにします。
1 2 | $ cd $ mkdir tools |
最初のcdコマンドでホームディレクトリに行き、次のmkdirコマンドでtoolsというディレクトリを作ります。
このtoolsの下に、自分が作ったシェルスクリプトを入れてください。
cpでもmvでも、ファイラーでのマウス操作でも構いません。
終わったら、
1 | $ ls ~/tools |
とやって、確かにsample1.shがtoolsの下にあることを確認しておきましょう。
終わったら、cdコマンドでホームディレクトリにいき、sample1.shを実行してみましょう。
1 2 | $ cd $ sample1.sh |
このとき、sample1.shはtoolsの下にあるので、シェルが見つけられずエラーが発生するはずです。
次に、パスを通す操作をします。
.bashrcをエディタで開き、以下のようにパスを通します。
1 | export PATH=~/tools:$PATH |
書いたら、.bashrcをsourceコマンドで再度読み込み、同じようにsample1.shを実行してみましょう。
1 2 | $ source .bashrc $ sample1.sh |
今度は無事実行されたはずです。~/toolsにパスが通ったので、シェルがsample1.shを見つけてくれたわけです。
パスを通すときには、上記のように$PATHを入れておくことに注意してください。これを忘れると、元々設定してあったPATH変数の内容が消えてしまいます。
上記の設定は、「元々設定してあったPATH変数に、~/toolsを加え、新たにPATH変数として定義した」という意味になります。
なお、シェルによるコマンドの探索は、このPATH変数の設定で書いた順に行われます。
カレントディレクトリにパスを通す
ところで先ほど、sample.shを作成した直後に、
1 2 | $ ./sample1.sh $ sample1.sh |
の2つの操作で違いがあったことに疑問を持たれた方も多いでしょう。
これは、「カレントディレクトリも、デフォルトではパスが通っていない」ことが原因です。
これは後々不便になることがあるので、この際ですから、カレントディレクトリにもパスを通しておきましょう。
先ほど.bashrcを編集した所を、
1 | export PATH=./:~/tools:$PATH |
としておいてください。これでPATH変数にカレントディレクトリ”./”もセットしたことになります。
sourceすれば、次回からはカレントディレクトリも探索範囲に含めてくれます。