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

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

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

答え2

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

いいえ、シェル可能リンクがディレクトリを指し、 '--strip-trailing-slashes'オプションを指定すると、ユーザーがそのタスクの副作用を部分的に防ぐことができる場合、これは合理的に見えます。これが引用したテキストの文字通りの意味です。

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

事実ではないので、行く場所はありません。 POSIX はファイル名の完成動作を指定しません。

2番目の太字の段落は、前の文で説明した動作を示していますが、太字で表示されていません。POSIXパス名解決のためには、aで終わるパスを/ディレクトリとして扱う必要があります。可能であればエラーが発生します。太字で示されている段落では、以前は無関係な文を参照しません。

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

実際、このオプションはその事実の例です。

関連情報