web-dev-qa-db-ja.com

シンボリックリンクでのlsコマンドの使用

lsコマンドを使用しているときに、ディレクトリへのシンボリックリンクの内容または情報を見つけようとすると、現在何が起こっているのか理解できません。オプションがあることを理解しています-Hは、コマンドラインにリストされたシンボリックリンクをたどるlsコマンド用です。 lsのマニュアルページに記載されていないのは、これは-lオプション。私が単にls symLinkToDir it will追加オプションなしでリンクされたディレクトリの内容をリストします。しかし、もし私がls -l symLinkToDir含まない限り、リンクに関する情報のみが表示されます-Hオプションも。この例は私が話していることです:

brian@LinuxBox:~$ ls playground/linkedDir
file4  file5
brian@LinuxBox:~$ ls -l playground/linkedDir
lrwxrwxrwx 1 brian brian 4 Feb 18 16:42 playground/linkedDir -> dir2
brian@LinuxBox:~$ ls -lH playground/linkedDir
total 0
-rw-rw-r-- 1 brian brian 0 Feb 18 16:41 file4
-rw-rw-r-- 1 brian brian 0 Feb 18 16:41 file5

ここで何か理解できませんか?これはそれがどのように機能するのか奇妙な方法ですか?これが実際にどのように機能するかは、マニュアルページで、シンボリックリンクが-Hオプション?ご協力いただき、ありがとうございます。

6
bmcentee148

ディレクトリへのシンボリックリンクでのlsの動作は、-lおよび-Hだけでなく、多くのオプションに依存します。シンボリックリンクの動作オプション(-L-H)がない場合、ls symlinkToDirはディレクトリの内容を表示しますが、ls -l symlinkToDirls -d symlinkToDirおよびls -F symlinkToDirシンボリックリンクに関する情報をすべて表示します。

GNU lsの実装)のmanページを読んでいると、完全な話は得られません。GNU manページ単なる要約です。完全なドキュメントは、Infoマニュアル(info ls)にあります。通常、最近HTMLで利用できます。Infoマニュアルのディレクトリへのシンボリックリンクのデフォルトの動作も見つかりませんが、これはドキュメントのバグ。

たとえば FreeBSDのマニュアルページ の方が正確ですが、デフォルトの動作を見つけるには-Hオプションの説明を読む必要があります。

-Hコマンドラインのシンボリックリンクをたどります。 -F-d、または-lオプションが指定されていない場合、このオプションが想定されます。

より正式な説明が必要な場合(ただし、読みやすくはありません)、 POSIX仕様 を参照してください。これには、実装の拡張機能はありません。

-d、-F、または-lオプションの1つ以上が指定され、-Hオプションも-Lオプションも指定されていない場合、ディレクトリへのシンボリックリンクタイプのファイルを指定する各オペランドに対して、lsはファイルの名前と、要求された関連情報。 -d、-F、または-lオプションのいずれも指定されていない場合、または-Hまたは-Lオプションが指定されている場合、ディレクトリへのシンボリックリンクタイプのファイルを指定する各オペランドに対して、lsはファイルの名前を書き込みます。ディレクトリ内に含まれ、要求された関連情報も含まれます。

どうやらそれは POSIXで必須

-d-F、または-lオプションが指定されている、または-Hまたは-Lオプションが指定され、ディレクトリへのシンボリックリンクタイプのファイルを指定する各オペランドに対して、lsは、ディレクトリ内に含まれるファイルの名前と要求されたファイルの名前を書き込みます。関連情報。

-Fまたは-lがない場合、ディレクトリへのリンクは実際のディレクトリと同じように見えるため、ls $link_to_dirls $dirと同じように機能する可能性があるため、私はそれが存在するとしか想定できません。

linkdirを指している場合、dirとリンクはリスト内で左右が同じように見え、コマンドラインで使用しても同じように動作します。

$ ls
dir  link
$ ls dir
bar  foo
$ ls link
bar  foo

しかし-Fは違いを明らかにします:

$ ls -F 
dir/  link@
$ ls -F dir
bar  foo
$ ls -F link
link@
2
ilkkachu