ls
私はかなり長い間完全に混乱しており、読み取り権限があるにもかかわらず、特定の場所で働くことを拒否しました。ちょっとした混乱の終わりにls
orを使って実行している限り、それはうまく機能することがわかりました。ただし、or--color=never
を使用して実行するとすぐに、実行権限がないすべての項目に慣れているエラーが発生します。auto
always
Permission denied
この問題の原因は何であり、ls
出力色を維持しながらこれを防ぐ方法は何ですか?
更新:さて、いよいよ見つけました(いつものように助けを求めた直後)。ディレクトリに入るには実行権限が必要なので、cdとls --colorはこの権限を持たないディレクトリでは機能しません。なぜそれがないディレクトリでls --color = neverを使い続けることができるのかわかりません。なぜそうなのだろうか?
答え1
ディレクトリの内容(アイテム名)を表示するには、そのディレクトリに対する読み取り権限のみが必要です。
/bin/ls
これは、問題なくすべての名前を実行して表示できることを意味します。
ただし、名前を表示する色を決定するには、ls
アイテムで別のプロパティを使用してください。ファイルのメタデータ(権限、サイズ、ファイル形式など)を使用します。これにはファイルでstat()
なければならず、成功するにはディレクトリに対する実行権限が必要です。
ディレクトリ内のファイル名だけが必要です。読み取り権限のみが必要です。ディレクトリ内のファイルのメタデータ:読み取りおよび実行権限が必要です。
答え2
タイプなどを考慮せずにディレクトリ内のエントリの名前だけを一覧表示するには、ディレクトリに対する読み取り権限のみを使用できます。
ディレクトリの内容に色を付けるには、アイテムのls
種類(他のディレクトリ、一般ファイル、デバイス、シンボリックリンクなど)、サイズ、シンボリックリンクの宛先に関する情報を知る必要があります。アイテムにこれらの内容を呼び出します。これには、+x
そのプロジェクトを含むディレクトリの権限ビットが必要です。 (実際にはカーネルのバージョンによってはまだいくつかの色を得ることができます。getdents
名前とタイプが提供されるかもしれません。)
ところで、私のバージョンls
では、許可拒否エラーが発生した後でも(すべての色にもかかわらず)まだディレクトリが一覧表示されます。他の奇妙なものを見たい場合は、以下を試してください-l
。
$ ls -l test 2>/dev/null
total 0
l????????? ? ? ? ? ? badsymlink
-????????? ? ? ? ? ? empty
p????????? ? ? ? ? ? fifo
l????????? ? ? ? ? ? goodsymlink
-????????? ? ? ? ? ? notempty