SSブログ

「絶対パス」と「相対パス」(「+α」もあるよ!) [概論・概要]

 さて。
 lsコマンドでもちらっと登場し、あまりきちんと説明していなかった問題にここで触れねばならない。「絶対パス」と「相対パス」の問題。(そして+αもあるよ!)

 UNIX/Linuxを利用するに当たって必ず正しく理解しなければならない問題がある。それが「パス」(「パス名」)の問題である。

 「パス」(「パス名」)とはなにか。それは、「ファイルやディレクトリの所在位置を表すキーワード」のこと。

 たとえば、lsコマンドを用いて次のコマンドを表示させてみよう。

 「ls -l /bin/ls

 これを実行すると、lsコマンドの実行ファイルが表示される。
[piro791@kagami ~]$ ls -l /bin/ls
-rwxr-xr-x 1 root root 95116 10月 27 11:12 /bin/ls


 また、 「ls -l ../../bin/ls」と実行してみるとどうだろうか。
[piro791@kagami ~]$ ls -l ../../bin/ls
-rwxr-xr-x 1 root root 95116 10月 27 11:12 ../../bin/ls

 ※注釈※ 使用しているサーバによってはエラーになる場合もある。その場合は、「ls -l ../../../bin/ls」を試してみてもらいたい。その場合でもエラーになるときは、サーバ管理者に問い合わせてみて欲しい
 表示される結果は微妙に異なっているが、実は両方とも同じファイルを表示しているのである。

 まず、最初の例では「/bin/ls」このように指定した。これを「絶対パス指定」という。一方、2つめの例では「../../bin/ls」と指定している。これを「相対パス指定」という。

 「絶対パス指定」とは、UNIX/Linuxにおける、ルートディレクトリを基点としてディレクトリをたどっていった場合のファイルやディレクトリの所在地を現す方式のことをいう。
 たとえて言うならば、「正式な住所」を表現していると考えてもらうとわかりやすい。「東京都千代田区永田町一丁目11番1号」というような感じ。

 他方、「相対パス指定」とは、現在のディレクトリ(カレントディレクトリ)を基点としてディレクトリをたどっていった場合のファイルやディレクトリの所在地を表す方式をいう。
 たとえて言うならば、『誰かに道案内をするとき』のことを想像してもらうとわかりやすい。「ここ(今いる場所)から最寄の駅に行くにはどうしたらいいですか?」と道を尋ねられた場合に、たとえば、『今来た道を戻って、2つ目の信号のある交差点を左に曲がり、その道をまっすぐ歩いて3つ目の交差点を右に曲がると、左手に駅が見えますよ』というような案内をした場合が、「相対パス指定」の発想に近いといえる。

 絶対パス指定相対パス指定との見分け方は簡単で、パス(パス名)の先頭が、「/」ではじまっているか、いないかで見分けることが出来る。
 絶対パス指定の場合は「/」で始まっているし、相対パス指定の場合は「/」以外の文字で始まっている。

 実は、lsコマンドの解説(その前のviの使い方などでも…)で絶対パス指定相対パス指定と両方使っていたのであった。

 絶対パス指定の例としては、「ls -l /bin」というコマンドを使ったのを覚えているだろうか。これは、ルートディレクトリの中に有る「bin」というディレクトリを指定している。
 一方、相対パス指定の例としては、「ls -l hoge」というコマンドを使っている。これは、「hoge」というファイルだけを処理対象にした例であったが、実はこれは現在のディレクトリ(カレントディレクトリ)を基点に、そこにある「hoge」というファイルであることを意味していたのである。

 このように、ファイルやディレクトリの指定に絶対パス指定相対パス指定は欠かせない非常に重要な要素なのである。これに対する正しい理解を深めることもまた大変に重要なことであるので、こってりと説明をしておきたい。(笑)

1:「ルートディレクトリ」とディレクトリ区切り記号
 UNIX/Linuxのファイル(システム)は、「ディレクトリ・ツリー構造」と呼ばれる仕組みを採用している。「ツリー構造」というくらいなので、ツリー(木)に似た構造をしているということ。
 木は、幹の部分があり、その上に枝分かれした部分がある。この「幹の部分」そして分かれた「枝」の形が「ディレクトリ・ツリー構造」の要素になる。
 幹の部分は全ての枝の「根幹」にあたる部分。枝の先端から逆に辿れば必ず幹にたどり着く。そのような幹の部分に相当するディレクトリを、UNIX/Linuxでは「ルートディレクトリ」と呼ぶ。
 「ルートディレクトリ」は、「/」と表す。「ルートディレクトリ」もディレクトリの一つなので、中をのぞいてみることが出来る。さっそく見てみることにしよう。
[piro791@kagami ~]$ ls -la /
合計 162
drwxr-xr-x 22 root root  4096  2月  2 10:06 .
drwxr-xr-x 22 root root  4096  2月  2 10:06 ..
-rw-r--r--  1 root root     0  2月  2 10:06 .autofsck
-rw-r--r--  1 root root     0 11月 19 17:15 .autorelabel
drwxr-xr-x  2 root root  4096  1月 19 04:09 bin
drwxr-xr-x  4 root root  1024  1月 15 10:31 boot
drwxr-xr-x  9 root root  3420  2月  2 10:06 dev
drwxr-xr-x 83 root root  4096  2月  2 10:06 etc
drwxr-xr-x  3 root root  4096  1月  6 12:46 home
drwxr-xr-x 13 root root  4096  1月 22 04:02 lib
drwx------  2 root root 16384 11月 20 02:07 lost+found
drwxr-xr-x  2 root root  4096  3月 10  2009 media
drwxr-xr-x  2 root root  4096 10月 27 09:37 misc
drwxr-xr-x  3 root root  4096 12月  8 19:30 mnt
drwxr-xr-x  2 root root  4096  3月 10  2009 opt
dr-xr-xr-x 51 root root     0  2月  2  2010 proc
drwxr-x---  2 root root  4096 12月  8 22:56 root
drwxr-xr-x  2 root root 12288  1月 19 04:09 sbin
drwxr-xr-x  2 root root  4096 11月 19 17:06 selinux
drwxr-xr-x  2 root root  4096  3月 10  2009 srv
drwxr-xr-x 11 root root     0  2月  2  2010 sys
drwxrwxrwt  3 root root  4096  2月  2 10:06 tmp
drwxr-xr-x 14 root root  4096 11月 19 17:10 usr
drwxr-xr-x 21 root root  4096 11月 20 12:06 var

 こんな感じに見えると思う。もしかしたら多少ディレクトリが多かったりすることもあるかもしれない。
 (※なお、サーバ管理者のポリシーによっては、ルートディレクトリが上記のように見えないこともある。管理者のポリシーによっては「偽物のルートディレクトリ」までしかアクセスを許していないケースも考えられる。詳しくはサーバ管理者に問い合わせてもらいたい。)

 「ルートディレクトリ」は非常に重要なディレクトリであるから、サーバの利用者はこのディレクトリに対して自分のファイルを作成したりコピーしたり保存したりしてはいけない。(サーバ管理者がここに置くように指示してき時は別。)

 「ルートディレクトリ」にあるそれぞれのディレクトリを指し示す際には、「ルートディレクトリ」であることを示す「/」に続けて、それぞれのディレクトリの名前を記述する。たとえば、「ルートディレクトリ」の中に見える、「bin」というディレクトリを指し示したい場合には…

 /bin

 という具合になるし、「tmp」というディレクトリならば

 /tmp

 という具合になる。

 「bin」や「tmp」がディレクトリである…というその証拠は、ファイルにまつわる情報の中で説明している。
 lsコマンドの表示で、「bin」や「tmp」の名前の表示の先頭に、「drwxr-xr-x」という表示がある。この「d」が、「これはディレクトリですよ」と主張しているのである。よくおぼえていなかった人はおさらいをしておいてもらいたい。


 「/bin」や「/tmp」もディレクトリなので、当然lsコマンドで中を見ることができる。「/bin」ディレクトリを見てみよう。
[piro791@kagami ~]$ ls -la /bin
合計 7440
drwxr-xr-x  2 root root    4096  1月 19 04:09 .
drwxr-xr-x 22 root root    4096  2月  2 10:06 ..
-rwxr-xr-x  1 root root    4988  9月  4 04:55 arch
lrwxrwxrwx  1 root root       4 11月 19 17:09 awk -> gawk
-rwxr-xr-x  1 root root   18484 10月 27 11:12 basename
-rwxr-xr-x  1 root root  735004  1月 22  2009 bash
-rwxr-xr-x  1 root root   23132 10月 27 11:12 cat
-rwxr-xr-x  1 root root   41828 10月 27 11:12 chgrp
-rwxr-xr-x  1 root root   38564 10月 27 11:12 chmod
-rwxr-xr-x  1 root root   44020 10月 27 11:12 chown
-rwxr-xr-x  1 root root   71524 10月 27 11:12 cp

 長いので後ろの方は省略しているが、このように、「/bin」ディレクトリの中身が見えている。この中に、「cat」というファイル(コマンド)があるのだが、このファイルを指し示したい場合(つまり、「ルートディレクトリの中にあるbinディレクトリの中に有るcatというファイル」)は、次のようなルールで表現される。

 /bin/cat

 ちょっとカラフルな表現になってしまったが(笑)、先頭の赤い「/」は、ルートディレクトリを意味する記号。続けてディレクトリの「bin」と並んでいるが、ディレクトリの「bin」と、ファイル名の「cat」との間に再度「/」が現れていることが判る。この「/」は、ディレクトリ区切り記号の意味を持ち、先頭の赤い「/」とは全く意味合いが異なっていることに注意して欲しい。
 ディレクトリの中にあるさらに別のディレクトリの中に…みたいなことになってくる場合も、ディレクトリとディレクトリとの名前を「/」で区切って並べることになる。たとえば、

 /home/piro791/lesson1.txt

 という指定をした場合は、「ルートディレクトリの中にあるhomeディレクトリの中にあるpiro791ディレクトリの中にあるlesson1.txtというファイル」を指し示していることになる。

2:「現在のディレクトリ」(カレントディレクトリ/ワーキングディレクトリ)

 ここまで、たびたび「現在のディレクトリ」という言葉が登場してきたが特に説明をしてこなかった。
 実は、サーバにログインしている間はサーバ利用者は常に「どこかのディレクトリ」に立っているということになっている。その「現在、立っている場所(=ディレクトリ)」が「現在のディレクトリ」ということになる。

 「現在のディレクトリ」を表す記号もあるので覚えておいてもらいたい。それは、ピリオド「.」である。

 lsコマンドの説明の際に、ファイル「hoge」を表示するとき、「ls -l hoge」と入力したのを覚えているだろうか。このコマンドによって、「現在のディレクトリにあるファイルhoge」が表示された。よって、基本的には現在のディレクトリを表す「.」は省略可能である。ちなみに、省略せずに表記した場合は

 ./hoge

 という表記方法を取ることとなる。

 ところがどっこい。このピリオドはそこらじゅうで大活躍するのである。基本的には省略可能ではあるものの、省略できない場面も少なくないのである。ピリオドを馬鹿にしてはいけないのである。(笑)


 それでは、「現在のディレクトリ」がどこにあるのか。それを調べるためのコマンドを紹介する。
 ものすごく簡単で…

 「pwd

 とだけ入力する。このコマンドにはオプションも無ければ引数も無い。無害なコマンドなのでさっそく試してみよう。
[piro791@kagami ~]$ pwd
/home/piro791

 この場合、「現在のディレクトリ」は、「/home/piro791」ですよ…と、言っている。そういえば、先ほど「ルートディレクトリの中身を見てもらったときに、「homeという表示が見えたことを思い出してもらいたい。

 「現在のディレクトリ」にあるファイル「hoge」を指し示すときに、

 hoge
 ./hoge

 上記2つの表記方法と、

 /home/piro791/hoge

 この表記方法とは、まったく同じファイルを意味しているということになる。
 なぜなら、「現在のディレクトリ」は「/home/piro791」であり、また「現在のディレクトリ」は「.」でもあるからだ。

 そして、冒頭の説明に戻るが、前者のピリオドを使った(り、または省略したりする)ファイルやディレクトリの表記方法が、「相対パス指定」であり、後者のルートディレクトリを基点とした表記方法が、「絶対パス指定」になるのである。(ふう…。長かった…)

3:「現在のディレクトリ」を移動する

 今度は「現在のディレクトリ」を実際に移動してみよう。
 ディレクトリを移動するコマンドがある。「cd」コマンドである。このコマンドは、多くの場合は引数を記述するが、引数を指定しないでただ単に「cd」とだけ実行することも少なくない。また、オプションを指定することも可能だが、あまりにもドマイナーすぎて知らない人も多いかもしれないというくらい、滅多に使わない。(私も年に1回あるかないか…じゃないかな??)

 lsコマンドの時のように、処理対象…つまり移動先となるディレクトリを指定すると、そのディレクトリに移動することが出来る。なお、コマンドの特性上、lsコマンドと違い、cdコマンドで指定できる処理対象はディレクトリのみとなる。ファイルを指定することは出来ない。(だって、「ディレクトリを移動する」と言っているのだから、ファイルを指定しても意味無いでしょ!?)

 では、ためしに「ルートディレクトリ」に移動してみよう。

 cd /

 と、実行する。
 すると…
[piro791@kagami ~]$ cd /

 コマンドを入力するプロンプトが微妙に変化したことがわかるだろうか。
 今までずーっと「~」という表示だったその場所が「/」と変わった。しかしコマンドは無言で終わっちゃうし、本当に移動できたのか良くわからないので、策ほど説明した「pwd」コマンドで、「現在のディレクトリ」が変化しているかどうか調べてみよう。
[piro791@kagami ~]$ cd /
[piro791@kagami /]$ pwd
/

 というわけで、確かに変わっていることが判った。「現在のディレクトリ」は「ルートディレクトリ」にあることになった。
 つまり、「.」と、「/」とは、同じディレクトリを指し示していることになる。(判りますか!?)

 ということは、先ほどlsコマンドで「/bin」ディレクトリの中身を覗いたときの操作は

 ls -l /bin

 と、

 ls -l bin
 ls -l ./bin

 とは、全く同じディレクトリを指し示し、同じ内容が表示されることになる。(判りますか!?大丈夫ですか!?)

 一方で、ファイル「hoge」を表示した際に、「ls -l hoge」と実行したアレ。どうなるか判りますか?
[piro791@kagami /]$ ls -l hoge
ls: hoge: そのようなファイルやディレクトリはありません

 こういうことになる。(理由は判りますか!?)

 だって、「現在のディレクトリ」が移動してしまったのだもの。先ほどは「現在のディレクトリ」が違うところにあって、その場所にファイル「hoge」があったのに、今は「ルートディレクトリ」に移動してしまったのだから、「現在いる場所」にそんなファイルは無いよ!…ということになるのであった。

 では、どうすればよい!?方法は2つある。
  ①絶対パスで指定する
  ②相対パスで指定する

 (あまり面白くないな…)

 「絶対パス」で指定するならば、先ほどディレクトリを移動する前に「pwd」コマンドで表示されたディレクトリをファイル名の先頭につけて指定することになる。

 この記事のサンプルでは先ほど「pwd」を実行したときには、「/home/piro791」であった。このディレクトリの中に有るファイル「hoge」を表示したいのなら…

 ls -l /home/piro791/hoge

 とすればよいことになる。試してみる。
[piro791@kagami /]$ ls -l /home/piro791/hoge
-rw-rw-r-- 1 piro791 piro791 7  1月 15 13:02 /home/piro791/hoge

 表示された。


 もう一つ。「現在のディレクトリ」から相対的にディレクトリを辿っていく方法も残されている。
 「現在のディレクトリ」の中にあるhomeディレクトリの、そのまた中にあるpiro791ディレクトリの、そのまた中にあるファイルhoge…ということなので、

 home/piro791/hoge
 あるいは
 ./home/piro791/hoge
 ということでも良い。
 試してみると…
[piro791@kagami /]$ ls -l home/piro791/hoge
-rw-rw-r-- 1 piro791 piro791 7  1月 15 13:02 home/piro791/hoge
[piro791@kagami /]$ ls -l ./home/piro791/hoge
-rw-rw-r-- 1 piro791 piro791 7  1月 15 13:02 ./home/piro791/hoge

 同じものが見えているのであった。

4:「上位ディレクトリ」

 「絶対パス指定」と「相対パス指定」との違いが微妙にでも判ってきただろうか。
 それでは、今度は「現在のディレクトリ」をもっと他の場所に移動して試してみることにしよう。

 cd /usr/local

 と、実行してみてもらいたい。ついでに、pwdコマンドで、移動できたことも確認しよう。
[piro791@kagami /]$ cd /usr/local
[piro791@kagami local]$ pwd
/usr/local

 さて。この場所から、たとえば「/bin/ls」ファイルを相対パス指定で指し示したいとしたらどうすればよいか…。

 これまでのこのアーティクルの中では、「いきなり幹を指し示す」(つまり「/」)か、または枝の末端方向に向かって進む方法しか説明してこなかったので、ここでは「相対的に幹の方向に戻る方法」が必要となってくる。

 それはずばり、「..」という記号を用いる。ピリオド2個ね。

 この「..」を用いると、ディレクトリ1段階分、幹の方向に移動することが出来る。「親ディレクトリと呼ぶことも多い。
 さきほど「/usr/local」というディレクトリに移動してもらったが、この状態で「..」を指定すると、「/usr」というディレクトリを指し示すこととなる。

 cdコマンドで、「..」を指定してディレクトリを移動、移動後にpwdコマンドで確認してみよう。すると…
[piro791@kagami local]$ pwd
/usr/local
[piro791@kagami local]$ cd ..
[piro791@kagami usr]$ pwd
/usr

 と、このように幹の方向に1段階戻ることができた。この指定方法は、同じレベルの隣のディレクトリへの移動等には特に重宝する。
 たとえば、先ほど移動してもらった「/usr/local」というディレクトリは、「/usr」というディレクトリの中にあるが、このディレクトリには「local」のほかに「bin」や「etc」、「lib」などといったディレクトリも存在している。同じレベルのとは、同じ「/usr」の中にある別々のディレクトリを言っている。
 再度「/usr/local」に移動してもらい、その状態から「/usr/bin」に移動する場合。

 cd /usr/bin  と指定するのは絶対パス指定の方法。
 cd ../bin  と指定するのが相対パス指定の方法になる。

 ちなみに、この記述方法は複数使っても良い。
 現在のディレクトリが /usr/bin の状態で、
 ../ → 1段階幹に戻った状態 → /usr
 ../../ → 2段階幹に戻った状態 → /

 ということになる。



 えらい長くなったが、重要なことなので次のアーティクルで再度説明を続けたい。

nice!(0)  コメント(2)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 2

upksggq

Спасибо за информацию!!!!!
by upksggq (2019-05-25 07:50) 

BardadynovHX

Приветствую.
Производим:
ремонт устройств плавного пуска, автоматизация технологических процессов, ремонт промышленной электроники, ремонт частотных преобразователей, наладка промышленной автоматики, ремонт силовой электроники, модернизация промышленного оборудования:
ACH 400, C102025, ATV61HU30Y, ATV61HD15M3X, CIMR-F7Z40551A, FR-E720S-008, CIMR MR5N 23P7, CIMR-E7Z20370, FR-F520-30K, N3-207-C, CSX-045-V4-C1, FR-D740-036, FR-S510WE-0.75K, MA7200-4002-N4, EQ7-2030-C, E1-9013 600H, CIMR-E7C47P51, ATV61HD45M3X, CIMR MR5N 2015, N3-420-N1, PA7300-4400-N1, FR-A241E-55K-UL, ATV71HD11N4S337, CSXI-075-V4-C1, ATV71E5U15N4, M100-01200033A, ATV61EXC5C50N, VFD750F43A, 3G3RV-B420K, ATV312HU22N4B, L300P-075HFU2, Freqrol, FR-V220E-37K, VFD004E21A, ATV61WU22N4, ATV71HD37N4Z, FR-A220-45K-UL, CIMR-V7SC40P47, CIMR-G7A42200, 3G3PV-A4185, FR-A740-00710, M800-03400025A, L100-002NFU, C1MR-L7Z2037, ATV312H037M2, M700-07200750A, CIMR-G7A41600, ATV31C055M2, L200-007NFU, MA7200-2007-N4, EQ5-4100-C, ATV61WU75N4U, EQ5-4600-C, 3G3PV-A2075, L300P-1320HFU2, EQ7-4001-C, EI-9011-075H, ATV12HU22M2TQ, CIMR-F7A40300, ATV71HD37N4383, CIMRG7C41320B, ATV71HC31N4, CIMR M5A 2022, FR-A120E-7.5K, VFD1320CP43A-00, PA7300-2015-N1, FR-A740-04810, FR-V520-22K, FR-F740-01160, ATV61QC20N4, FR-A140E-15K, L300P-750HFU2, M200-06400350A, PA7300-2030-N1, FR-A220-5.5K-UL, ATV71WD15N4A24, TMVRXE18-3000-4160-12, ATV61HD37M3X, WJ200-004HF, ATV61EXC2C31N4, CIMR-XCAEA0P7, SMC933000-P, CIMR-F7Z41101B, CIMRJ7AZ20P10, M400-02200042A, ATV312H075M2, ATV312HD15S6, VZA21P5BAA-S5030, M300-02200075A, M800-10202830E, M300-02200024A, M800-03200066A, M700-06400350A, N3-230-N1, ATV61ES5C40N4, ATS01N232RT, ATS48D75Y, ATV212HD18M3X, M200-01100056A, ATV71WD11N4, и др.

<a href="https://prom-electric.ru/articles/1/1/">ремонт преобразователей частоты</a> в Prom Electric
by BardadynovHX (2019-08-04 04:42) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。