ファイル名を拡張すると、シンボリックリンクの後にスラッシュが追加されますか?

ファイル名を拡張すると、シンボリックリンクの後にスラッシュが追加されますか?

coreutilsマニュアルから:

一部のGNUプログラム(少なくともcpとmv)では、各ソース引数を操作する前に次のスラッシュを削除できます。 --strip-trailing-slashesオプションを使用すると、この動作が可能になります。

これは、ソースパラメータの後にスラッシュがあり、ディレクトリへのシンボリックリンクを指定するときに便利です。このような状況は実は非常に一般的なことなので一部のシェルは、これらのシンボリックリンクでファイル名を完成させると自動的に末尾のスラッシュを追加できます。このオプションがない場合、たとえば、mv(システムの名前変更機能を介して)は末尾のスラッシュをシンボリックリンク逆参照要求として解釈する必要があるため、シンボリックリンクの代わりに間接的に参照されるディレクトリの名前を変更する必要があります。この動作がデフォルトになったことは驚くように見えるかもしれませんが、これはPOSIXで必要です。標準の他の部分とも一致します。

太字は、シェルのファイル名拡張子がシンボリックリンクの後にスラッシュを追加することを意味しますか?

BashのマニュアルやPOSIX仕様のどこで見ることができますか?

最初は、コマンド(シェルではない)がコマンドライン引数として末尾のスラッシュの有無にかかわらずシンボリックリンクを解釈する方法によって異なります。

ベストアンサー1

POSIX 必須の動作は、mv末尾のスラッシュをシンボリックリンク逆参照要求として解釈することです。つまり、fooシンボリックリンクの場合、POSIXmvは(他のコマンドと同様に)解釈する必要があることを指示します。

mv foo/ bar/

foo自分の代わりに指すディレクトリを移動する要求ですfoo。これはおおよそパス名の確認:

1つ以上のスラッシュ以外の文字を含み、1つ以上の末尾のスラッシュで終わるパス名は、ドット.文字()がパス名に追加されたかのように解析されます。

つまりfoo/foo/.

POSIX は、シンボリックリンクの後にスラッシュを追加するパス名拡張を強制または許可しません。これは、デフォルト以外のオプションを設定するときに一部のシェルが実行するアクションです。 Bashにこのオプションがあるかどうかはわかりません。 Zshにもset -o markdirsこのオプションがありますが、ディレクトリへのシンボリックリンクではなく、ディレクトリにのみ影響します。

それ以外の場合は、末尾のスラッシュが自然にパラメータの末尾に表示されます。スラッシュで終わるglobの場合、globはディレクトリとディレクトリへのシンボリックリンクのみと一致し、ファイル名拡張は末尾のスラッシュを保持します。したがって、mv a*/ /somewhere名前で始まる現在のディレクトリのすべてのサブディレクトリaと、現在のディレクトリにあるすべてのシンボリックリンクターゲットが移動され、シンボリックリンクがディレクトリで始まりディレクトリをターゲットにしaます。別のケースは完了しました。 bashとzshには完了オプションがたくさんあるので、詳しく説明しません。ただし、オプションによってfoo/完了で終わり、ディレクトリへのシンボリックリンクになりfooやすいです。foo

おすすめ記事