realpath
コマンドの詳細と、readlink -f
が推奨されるようになったため、このコマンドがどのように非推奨になったかを読んだことがあります。 realpathが導入された理由は、readlinkにそのような機能がないためであり、いったんそれが導入されると、realpathは不要になり、そのサポートはほとんどのOSベンダーによって中止されたということも、いくつかの場所で見ました。
私の質問の理由は、多くの人がreadlink -f
をrealpath
と「かなり似ている」コマンドとして推奨していることも知っているためです。 「かなり似ている」部分。実際の違いは何ですか?
周りにはいくつかのrealpath
コマンドがあります。
realpath
ユーティリティは、 realpath
ライブラリ関数のラッパーであり、多くの times が再発明されました。
Debianは realpath
パッケージ( separated from dwww
from woody )これは、2001年以降、パッケージとドキュメントに関するもの以外は変更されていませんが、現在は廃止されています。標準ユーティリティ(GNU readlink
およびすぐにGNU realpath
)があるため、このユーティリティは廃止されましたが、GNUユーティリティにはreadlink
さえまったくありませんでした。このrealpath
の実装は、シンボリックリンクの解決を防止したり、nullで終了する出力を生成したりするために、いくつかの options
をサポートしています。 BusyBox には、独自の realpath
コマンドも含まれます(オプションはありません)。
GNU coreutils は、 realpath
コマンドを version 8.15 で2012年1月に導入しました。これはBusyBoxとDebianのrealpath
の互換性のある代替品であり、GNU readlink
と共通の多くのオプションもあります。
realpath
はreadlink -f
と同じ効果があり、GNU readlink
を使用します。 2つのコマンド(またはreadlink -f
からのさまざまなrealpath
コマンド)を区別するのは、それらがサポートする追加のオプションです。
GNU realpath
は非推奨ではありません。それは反対の問題を抱えています:それはどこでも利用可能であるにはあまりに新しいです。 Debianは GNU realpath
を coreutils
パッケージから省略し、独自のrealpath
を使用していました。 GNU realpath
はドロップイン置換である必要があるため、理由はわかりません。ただし、Debian jessieおよびUbuntu 16.04以降、GNU realpath
が使用されます。
Linuxシステムでは、現時点では、シンボリックリンクを含む可能性のあるパスを正規化する最善の策はreadlink -f
です。
BSDシステムには、GNU readlink
とは異なる機能を持つ readlink
コマンドがあります。特に、BSD readlink
には、パスを正規化するオプションがありません。渡されたシンボリックリンクをトラバースするだけです。
偶然にも、readlink
には同じ問題がありました。これも 何度も発明されました (UNIXにシンボリックリンクが追加されたときに、このユーティリティを追加しなかったのは残念な省略です)。現在、多くの互換性のないフラグ(特にBSD対GNU)を持ついくつかの実装で安定しています。
tl; drreadlink -f
は、既存のディレクトリに存在しないファイルに対して0
を返しますが、realpath
は1
を返します。ただし、readlink -e
はrealpath
のように動作し、存在しないファイルに対して1
を返します(最後の編集者注を参照)。
readlink -f
$ readlink -f non-existent-file
/home/user/non-existent-file
$ echo $?
0
readlink -e
$ readlink -e non-existent-file
$ echo $?
1
realpath
$ realpath non-existent-file
non-existent-file: No such file or directory
$ echo $?
1
readlink -f
存在しないディレクトリreadlink -f
の動作は、パスのどの部分が存在しないかによって異なります。
$ readlink -f /tmp/non-existent-dir/foo
$ echo $?
1
realpath
存在しないディレクトリ$ realpath /tmp/non-existent-dir/foo
$ echo $?
1
readlink
は、ほとんどのLinuxディストリビューションにインストールされています。一方、realpath
は明示的にインストールする必要があります。
realpath ...
の呼び出しを置き換える場合は、readlink -e ...
を使用します。
Ubuntuでreadlink(GNU coreutils)8.21およびrealpath version 1.19でテスト済み16。
(編集: @AnthonyGeogheganは「これはrealpath
のDebianバージョンを指します。GNUバージョンof realpath
はreadlink -f
と同じように動作します ")