1. 概要

この記事では、Linuxでの不思議なダブル( .. )とシングル()ドットの意味を学びます。

2. Linuxiノード

Linuxでは、iノードはファイルの名前と内容を除くファイルに関するすべての情報を格納するために使用されるデータ構造です。 ディレクトリには、すべてのファイルが、情報のフェッチに使用されるファイル名と対応するiノード番号を持つエントリとして存在します。iノードは次の情報を保持します。

  • 作成/変更時間
  • サイズ
  • 権限
  • オーナー

iノード番号はファイルシステム内の一意の整数であり、単一のファイルのみを参照します。 iノードは通常、パーティションの先頭に格納されます。 iノードが不足すると、空き容量があっても「空き容量がありません」というエラーが発生する可能性があります。 iノード番号を使用してファイルへのすべてのリンクを検索することもできます。

lsコマンドを-iフラグとともに使用して、ファイル名とともにiノード番号を一覧表示できます。

$ cd /usr/bin
$ ls -i
  71520 [
  71521 [[
  48516 aconnect
  71522 acpid
  71523 add-shell
 129429 addgnupghome
  71524 addgroup
 127833 addpart
  30369 addr2line
...

3. Linuxハードリンク

ファイルの名前をメタデータから分離すると、ハードリンクを実装できます。 ハードリンクは特定のファイルのiノードへの単なるポインタであるため、ファイルシステム上の同じ場所を指します。ファイルのコピーではないため、ハードリンクを変更すると元のファイルも。

lnコマンドを使用してハードリンクを作成できます。

$ echo hello > original
$ cat original
hello
$ ln original hardlink
$ echo "This will modify the original" >> hardlink 
$ cat original
hello
This will modify the original
$ ls -i original hardlink 
     89 hardlink       89 original

ご覧のとおり、どちらも対応するiノードは同じです。 元のファイルを削除しても、ハードリンクは引き続きアクセス可能であることに注意してください。 これがハードリンクとシンボリックリンク

4. 何をするか’。’ と’..’意味?

‘。’ および「..」は、iノードのリンク数を増やすという点で上記で説明したハードリンクに似ていますが、ファイルシステムに組み込まれているため削除することもできません。さらに、ディレクトリへのハードリンクはありえない。 したがって、それらをハードリンクと正確に呼ぶことはできません。より正確な用語は「name-inodemaps」です。

ファイルシステムでは、ダブルドット( .. )を使用して親ディレクトリにアクセスしますが、シングルドット()は現在のディレクトリを表します。

realpath を使用して、これを確認してみましょう。

$ pwd
/tmp/somedir
$ realpath .
/tmp/somedir
$ realpath ..
/tmp

ここで、 / tmp / somedir は現在のディレクトリであり、 /tmpはその親です。

ファイル名の前に1つのドット(。)を付けて「非表示」にすることができるため、-aフラグをlsに渡した場合にのみ表示されます。

$ echo "Hello" > normal_file
$ echo "Secret" > .hidden_file
$ ls
normal_file
$ ls -a
.             ..            .hidden_file  normal_file

5. ‘。’を使用するおよび「..」(Bash)

意外かもしれませんが、ダブルドットとシングルドットはbashにも適用されます。 ただし、これはファイルシステムでの通常の使用法とは異なります。

Bashでは、二重ドット( .. )を使用して、数字や文字などのシーケンスを生成します。

$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
$ echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z

二重点の前の始点と後の終点を指定します。

ファイルをソースするために単一のドット()を使用します。これは、基本的に現在のシェルでファイルを実行することを意味します。

$ echo "export VARIABLE='This variable will be set in the shell!'" > source_me
$ . ./source_me
$ echo "$VARIABLE"
This variable will be set in the shell!

6. 結論

この記事では、Linux iノード、ハードリンク、およびダブルドットとシングルドットのアプリケーションについて学習しました。