Linuxゲリラ戦記

パスワードの「パス」とは関係ないのだろうか。

アイキャッチ

78.Linuxのパスの話

ナックス「今回はLinuxのパスの話!」

デビー君「パスの話?ちょっと待ってナックス。先にパスの話をするのはどうかと思う」

ナックス「え?」

デビー君「確かに日本は海外と比べてチームプレーを大事にする傾向がある。日本のサッカーも長らくパスサッカーを目指して練習していた。でも、その結果日本は全然ゴールできないという決定力不足に陥ってしまったんだ。対して海外は昔から個の能力を伸ばして、日本とは比べ物にならないほどの高度なサッカープレーをしている。これからはチームではなく、個の時代なんだ。パス回しなんてもう時代遅れだよ。だからLinuxのパスの話なんかじゃなくて、まずはLinuxのシュートの話をするべきだと思う」

ナックス「……そういうんじゃない」

デビー君「そういうんじゃないんだ……」

ナックス「前回、私達はC言語でプログラムを作りました」

デビー君「はい」

ナックス「そして、実行する際は」

$ ./プログラム名

ナックス「みたいな感じで実行しました」

デビー君「はい」

ナックス「そして、Linuxについて調べたことがある人は、LinuxというものはC言語で作られていると聞いたことがあると思います」

ナックス「ということは、LinuxのコマンドもC言語で作られているはず……というぼんやりなイメージ」

ナックス「しかし、なぜでしょう?例えばwgetコマンドを使用するときは、」

$ ./wget http://www.garunimo.com

ナックス「のようにするのではなく」

$ wget http://www.garunimo.com

ナックス「のようにするのです」

デビー君「た、確かに!僕達が作ったプログラムは最初に./ってつけるけど、Linuxのコマンドは./をつけない!」

ナックス「そもそも私達は前回gccコマンドで実行可能ファイルを作成しました」

デビー君「はい」

ナックス「では、私達がLinuxで普段使用しているコマンドの実行可能ファイルがLinuxのディレクトリのどこかにあるのでは!?」

デビー君「な、なるほど。考えたこともなかった……」

ナックス「というわけで、早速実行可能ファイルを探してみましょう。探すのにはlocateコマンドを使用しましょう」

デビー君「locateコマンド?」

ナックス「locateコマンドについて忘れているなら36.ファイルを検索する、findコマンド、locateコマンド。何のファイルか調べる、fileコマンド。を見て思い出してね」

ナックス「以下のようにコマンドを使用してみましょう」

$ locate wget

ナックス「ちなみに、私のDebianの環境では以下のような実行結果になりました」

$ locate wget
/etc/wgetrc
/sbin/iwgetid
/usr/bin/wget
/usr/share/bash-completion/completions/wget
/usr/share/doc/wget
/usr/share/doc/wget/AUTHORS
/usr/share/doc/wget/ChangeLog.README
/usr/share/doc/wget/MAILING-LIST
/usr/share/doc/wget/NEWS.gz
/usr/share/doc/wget/README
/usr/share/doc/wget/changelog.Debian.gz
/usr/share/doc/wget/changelog.gz
/usr/share/doc/wget/copyright
/usr/share/info/wget.info.gz
/usr/share/locale/be/LC_MESSAGES/wget.mo
/usr/share/locale/bg/LC_MESSAGES/wget.mo
/usr/share/locale/ca/LC_MESSAGES/wget.mo
/usr/share/locale/cs/LC_MESSAGES/wget.mo
/usr/share/locale/da/LC_MESSAGES/wget.mo
/usr/share/locale/de/LC_MESSAGES/wget.mo
/usr/share/locale/el/LC_MESSAGES/wget.mo
/usr/share/locale/en_GB/LC_MESSAGES/wget.mo
/usr/share/locale/eo/LC_MESSAGES/wget.mo
/usr/share/locale/es/LC_MESSAGES/wget.mo
/usr/share/locale/et/LC_MESSAGES/wget.mo
/usr/share/locale/eu/LC_MESSAGES/wget.mo
/usr/share/locale/fi/LC_MESSAGES/wget.mo
/usr/share/locale/fr/LC_MESSAGES/wget.mo
/usr/share/locale/ga/LC_MESSAGES/wget.mo
/usr/share/locale/gl/LC_MESSAGES/wget.mo
/usr/share/locale/he/LC_MESSAGES/wget.mo
/usr/share/locale/hr/LC_MESSAGES/wget.mo
/usr/share/locale/hu/LC_MESSAGES/wget.mo
/usr/share/locale/id/LC_MESSAGES/wget.mo
/usr/share/locale/it/LC_MESSAGES/wget.mo
/usr/share/locale/ja/LC_MESSAGES/wget.mo
/usr/share/locale/lt/LC_MESSAGES/wget.mo
/usr/share/locale/nb/LC_MESSAGES/wget.mo
/usr/share/locale/nl/LC_MESSAGES/wget.mo
/usr/share/locale/pl/LC_MESSAGES/wget.mo
/usr/share/locale/pt/LC_MESSAGES/wget.mo
/usr/share/locale/pt_BR/LC_MESSAGES/wget.mo
/usr/share/locale/ro/LC_MESSAGES/wget.mo
/usr/share/locale/ru/LC_MESSAGES/wget.mo
/usr/share/locale/sk/LC_MESSAGES/wget.mo
/usr/share/locale/sl/LC_MESSAGES/wget.mo
/usr/share/locale/sr/LC_MESSAGES/wget.mo
/usr/share/locale/sv/LC_MESSAGES/wget.mo
/usr/share/locale/tr/LC_MESSAGES/wget.mo
/usr/share/locale/uk/LC_MESSAGES/wget.mo
/usr/share/locale/vi/LC_MESSAGES/wget.mo
/usr/share/locale/zh_CN/LC_MESSAGES/wget.mo
/usr/share/locale/zh_TW/LC_MESSAGES/wget.mo
/usr/share/man/cs/man8/iwgetid.8.gz
/usr/share/man/fr.ISO8859-1/man8/iwgetid.8.gz
/usr/share/man/fr.UTF-8/man8/iwgetid.8.gz
/usr/share/man/man1/wget.1.gz
/usr/share/man/man8/iwgetid.8.gz
/usr/share/perl5/newgetopt.pl
/usr/share/vim/vim74/syntax/wget.vim
/var/lib/dpkg/info/wget.conffiles
/var/lib/dpkg/info/wget.list
/var/lib/dpkg/info/wget.md5sums
$ 

ナックス「正直、私の想定以上に検索結果が色々でてちょっとびっくりしています」

ナックス「というわけで、私のなんとなくの知識で少しだけ解説します。あ、でも、使用しているディストリビューションによって検索結果が異なると思うので、あなたの環境に応じて適宜以下の解説を読み替えてください。あなたの環境が私と全く異なるようであれば、とりあえず説明だけ読んでください」

ナックス「まずは/usr/share/doc/ディレクトリの以下にwgetという名前のディレクトリがあります」

デビー君「はい」

ナックス「この/usr/share/docのdocはdocumet(ドキュメント)を意味します。つまり、wgetに関する資料が置かれています」

デビー君「wgetコマンドに関する資料……って何?」

ナックス「興味があれば中の資料を見てみてください。普通にテキストエディタ(nanoとかvimとか)で、中の資料を見ることが出来ます。docディレクトリの下は、wgetディレクトリに限らず、すべてドキュメントなので、wget以外の資料も興味があれば覗いてみると楽しいかも」

ナックス「次に/usr/share/locale/の下にもなにか色々資料があります。localeとは『場所(というより地域かな)』という意味です。つまり、/usr/share/locale以下のものは、言語の資料です。多分。たとえば、私達は日本語環境でLinuxを使用しているので、wgetコマンドを使用すると、進捗状況などが日本語で表示されます。その、日本語のための情報が/usr/share/locale以下にあるのです。ちなみに、jaが日本語という意味(japanのja)なので、usr/share/locale/ja/以下に日本語のための情報が入っているはず。例えばnlはオランダ語で、plはポーランド語です」

ナックス「そして、/usr/bin/wget。binというのは、binary(バイナリ)を意味し、機械語というような意味です。つまり、binディレクトリの中に、wget……いや、wgetに限らず、Linuxで使用するあらゆるコマンドの実行可能ファイルが入っているはず。ちょっと/usr/binディレクトリの中でlsコマンドを使用してみてください」

デビー君「おお!使ったことがないコマンドばっかりだけど、locateコマンドとかzipコマンドとかdiffコマンドとか知ってるコマンドの実行可能ファイルもある!」

ナックス「そうです。今まで私達はぼんやりコマンドを使用していましたが、実はちゃんとコマンドの本体があるのです!」

ナックス「実は、Linuxでは、ある特別なディレクトリに実行可能ファイルを置くと、コマンドの実行の前に『./』をつけなくても、コマンドを実行可能になるのです!」

デビー君「へー!」

ナックス「そして、その特別なディレクトリのことを『パスが通ったディレクトリ』と言います。パス(PATH)は『経路』という意味です」

ナックス「ちなみに、どこが『パスが通ったディレクトリ』なのかは、以下のコマンドを使用することで確認できます」

$ echo $PATH

デビー君「ん?echoって文字を表示するコマンドだよね$PATHは変数?つまり、$PATH変数の中身をechoコマンドで表示してるの?」

ナックス「その通りです。$PATH変数の中に、パスが通ったディレクトリの情報が入っています。実行結果は以下のようになります」

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

ナックス「この場合だと/usr/local/binディレクトリと/usr/binディレクトリと/binディレクトリと/usr/local/gamesディレクトリと/usr/gamesディレクトリにパスが通っていることになります。ディレクトリの情報を:で区切って表示していますね。ちなみに、これはただの一例で、使用しているLinuxディストリビューションによって実行結果は違うと思います」

デビー君「え!?パスが通っているディレクトリって複数あるの!?」

ナックス「はい。これらのディレクトリのどこかに実行可能ファイルがあれば、そのファイルは『./』を前につけなくても実行可能です」

デビー君「じゃあ、例えば/usr/loal/binディレクトリと/usr/gamesディレクトリの中に『fugafuga』っていう同じ名前の実行可能ファイルがあるけど、実はファイル名が同じだけで、動きは全然別の機能を持っている、みたいなプログラムがあった場合はどうなるの?」

ナックス「同じ名前の実行可能ファイルがあった場合は」

$ echo $PATH

ナックス「の実行結果の左側に書かれているディレクトに置いてあるものが優先されます。例えば先の例だと、実行結果は」

/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

ナックス「で/usr/gamesよりも/usr/local/binディレクトリのほうが左側にあるので、/usr/local/binディレクトリの中にあるfugafugaの方が実行される、ということになります」

デビー君「なるほどねー」

ナックス「というわけで、皆さんの中には『早速前回作った実行可能ファイルmojiをパスの通ったディレクトリのどこかにおいて、『./』無しで実行できるか試してみよう』と思っている方がいると思いますが、既に存在するパスが通ったディレクトリに、自作のプログラムを置くのはお勧めしません」

デビー君「え、なんで?」

ナックス「他の実行可能ファイルと混ざってしまい、そもそも自作のプログラムがどれで、元からあったプログラムがどれなのかが分からなくなってしまうからです。こういう場合は自分用にパスが通ったディレクトリを新たに作ってみましょう。次回に」

デビー君「次回かよ」

ナックス「待てない人は、他のサイトを参考にして、自分でパスが通ったディレクトリを作成してやってみていいよ(次回79.パスの通ったディレクトリを作成する)」

このエントリーをはてなブックマークに追加