私は新しいLinuxユーザーで、Arch Linuxと最近はLinux From Scratch(7.7)を学んでいます。新しくインストールされたALを手動でLFSホストとして設定しました(提供されたホストも使用)。バッシュスクリプト)私のホストの前提条件パッケージを確認しました。私の場合は、/usr/bin/yaccを/usr/bin/bisonに接続することを除いて、すべての違いを解決したと確信しています。
提供されたスクリプトの結果yacc is bison (GNU Bison) 3.0.4
ではありません/usr/bin/yacc -> /usr/bin/bison
。後者がシンボリックリンクの出力形式をチェックしているので、スクリプトは yacc が準備されているが、他のタイプのリンクを使用していることを知らせていると仮定します。私はLinuxファイルシステムについてさらに調査した結果、実際のデータはinode(メタデータ)として説明され、これは私たちがやり取りする(抽象)ファイルが指すものであるというおおよそのアイデアを得ました。単に同じinodeを指すファイルはハードリンクと見なされます(ただし、ファイルは互いに独立していると思います)。私は実行して、sudo ls -il /usr/bin | less
yaccとbisonのinode番号がわずかに異なることを発見しました(それぞれ152077と152078)。これはハードリンクされていないことを意味しますか、またはスクリプト出力を誤って解釈して修正する必要がありますか?
編集:bashスクリプトの関連コマンド:
bison --version | head -n1
if [ -h /usr/bin/yacc ]; then
echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`";
elif [ -x /usr/bin/yacc ]; then
echo yacc is `/usr/bin/yacc --version | head -n1`
else
echo "yacc not found"
fi
答え1
これにより、ls -il /usr/bin
ファイル名と一致するinode番号が一覧表示されます。この場合、「inode」から「filename」を分離し、inodeをファイルとして扱うことをお勧めします。
「inode」は通常、メタデータ(権限、所有権、作成時間、アクセス時間など)とファイルデータを含むディスクブロックを含むディスクデータ構造です。ファイルシステムに応じて、inodeは戦略的にディスクの周りに配置することも、ある種のデータベースに存在することもあります。ほとんどの場合、inode番号からinodeを含むディスクブロックに移動する高速アルゴリズムがあるため、検索は非常に高速です。
この観点から見ると、各ファイル名は「ハードリンク」に過ぎません。ディレクトリは単にファイル名とinode番号と一致します。 「実際のファイル名」と「ハードリンク」の間に違いはありません。したがって、ファイル名/usr/bin/yacc
と/usr/bin/bison
他のinode番号との一致は、2つの名前が異なるメタデータと異なるファイルデータを参照することを意味します。軽く言うと、両方のinodeに一致するファイル名が1つしかないため、これらのファイルはハードリンクではありませんが、技術的には両方のファイル名はハードリンクであり、それぞれはinode用です。単一のハードリンクです。
スクリプトと「ほぼ同じ inode 番号」に関する限りyacc
およびはbison
関連があります。私のArchノートブックから:
1032 % ls -li /usr/bin/yacc /usr/bin/bison
1215098 -rwxr-xr-x 1 root root 394152 Jan 23 2015 /usr/bin/bison*
1215097 -rwxr-xr-x 1 root root 41 Jan 23 2015 /usr/bin/yacc*
1033 % file /usr/bin/yacc
/usr/bin/yacc: POSIX shell script, ASCII text executable
1034 % cat /usr/bin/yacc
#! /bin/sh
exec '/usr/bin/bison' -y "$@"
ファイル名yacc
とbison
識別iノード番号の間には1つの区切りしかありません。それはおそらく順番に生成されるからです。ファイル名はyacc
シンボリックリンクやハードリンクを表しません。シンボリックリンクは出力で異なるように見えますls -li
。両方のハードリンクはそれぞれ同じ inode 番号を表します。
しかし、yacc
関連はbison
呼び出しですbison
。これがスクリプトが次の出力を提供する理由です。
bison (GNU Bison) 3.0.4
yacc is bison (GNU Bison) 3.0.4
あなたのスクリプト呼び出しは/usr/bin/yacc
実際に実行されます/usr/bin/bison
。
答え2
2つのファイルのinode番号が異なる場合、ハードリンクされません。これがハードリンクの定義です。ファイルシステムの異なる場所(別の名前または別のディレクトリ)にある同じファイル(したがって、inode番号を含む同じメタデータ)。
Bisonはyaccの実装です。より正確にはbison -y
POSIXをエミュレートしますyacc
。 yaccのさまざまな実装を.として使用できます/usr/bin/yacc
。あなたの場合、Bisonを.に一度/usr/bin/yacc
、/usr/bin/bison
。同じ方法で作成することも、そうでない場合もあります。ビルドスクリプトを確認してください。
dash、ksh、またはbashでは、次を使用して、とが同じファイルであるかどうか(つまり、同じファイルへのハードリンクであるシンボリックリンクチェーン(長さ0の可能性がある)かどうか)を[ /usr/bin/yacc -ef /usr/bin/bison ]
テストできます。/usr/bin/yacc
/usr/bin/bison