「realpath」と「readlink -f」の違いは何ですか


68

私はrealpathコマンドについて多くのことを読んでおりreadlink -f、現在推奨されていることから、コマンドが非推奨になった方法を読みました。いくつかの場所で、realpathが導入された理由はreadlinkにそのような機能がないためであり、いったん導入されると、realpathはもはや必要ではなく、ほとんどのOSベンダーによってサポートが中止されることを見てきました。

私の質問の理由は、多くの人がにreadlink -f「かなり似ている」コマンドとして推奨しているのを見たことrealpathであり、それが私を悩ませていることです。実際の違いは何ですか?

回答:


73

いくつかのrealpathコマンドがあります。

このrealpathユーティリティは、realpathライブラリ関数のラッパーであり、何も再発明されています。

Debianは、realpathパッケージ(woodyから分離さdwwwている)を維持していました。これは、2001年以降、パッケージングとドキュメントに関して変更されていませんが、現在は廃止されています。現在、より多くの標準的な代替(GNU とまもなくGNU )があるため、このユーティリティは非推奨になりましたが、当時はGNUユーティリティもまったくありませんでした。この実装では、シンボリックリンクの解決を防ぐため、またはヌルで終わる出力を生成するためにいくつかのサポートがあります。 BusyBoxには独自のコマンドも含まれています(オプションはありません)。readlinkrealpathreadlinkrealpathoptionsrealpath

GNU coreutilsは2012年1月realpathバージョン8.15でコマンドを導入しました。これはBusyBoxとDebianの互換性のある代替品でrealpathあり、GNUと共通する多くのオプションもありますreadlink

realpathreadlink -fGNU と同じ効果がありますreadlink。2つのコマンド(またはrealpathからのさまざまなコマンドreadlink -f)を区別するのは、それらがサポートする追加オプションです。

GNU realpathは非推奨ではありません。反対の問題があります。どこでも入手するには新しすぎるからです。Debianは以前、パッケージからGNUrealpath省略coreutilsし、独自のrealpath。GNU realpathはドロップインの代替品になるはずなので、その理由はわかりません。ただし、Debian jessieおよびUbuntu 16.04の時点では、GNU realpathが使用されています。

Linuxシステムでは、現時点では、シンボリックリンクを含む可能性のあるパスを正規化する最善の方法はreadlink -fです。

BSDシステムには、readlinkGNUとは異なる機能を持つコマンドがありますreadlink。特に、BSDにreadlinkはパスを正規化するオプションがありません。BSDに渡されたシンボリックリンクを通過するだけです。

readlink、偶然にも同じ問題がありました- 何度発明されました(Unixにシンボリックリンクが追加されたときにこのユーティリティを追加しなかったことは残念な省略でした)。現在、多くの互換性のないフラグ(特にBSDとGNU)を使用したいくつかの実装で安定しています。


8
readlink -fGNUよりずっと前にOpenBSDにいました。NetBSD、FreeBSD、およびOpenBSDのすべてが現在readlink -fリンクでも言及されています)います。realpathFreeBSDとIRIXには長い間あります(Debianのものより前のものかどうかはわかりません)。HPUXとIRIXにもありますがreadlink、そうではありません-frealpathDebianのExperimental のパッケージは、coreutils のパッケージになりました(問題が発生するかどうかを確認するための実験として)。dwww realpath以上のような行為readlink -eのようなGNU 1ながら、readlink -fそう、それは完全なDROPINではありませんが、交換してください
ステファンChazelas

2
realpath、その前に、2002年からはFreeBSDになっているpwd(2000年以降、それをやっていたpwd some-file呼ぶだろうrealpath()file)。Debianは持っていたrealpath私はそれが1998年にIRIX 6.5であったより証拠は他の見つかったものの、1996年以降のパッケージをIRIX上の1が、おそらくそれ以前からOpenBSDは追加-freadlink 1997年GNU readlinkは2003年に追加され-f、最初から使用ていました。
ステファンシャゼル14年

2
素晴らしいまとめありがとう。GNU変異型への切り替えのdebianの要求のためのより良いバグに注意することはありbugs.debian.org/730779でも既存のrealpathのメンテナは、スイッチが起こることを望んでいる
パドレイグ・ブレイディ

1
素晴らしい答え。のRHEL実装への参照のみを逃したrealpath。誰かがそれが何らかの形でreadlink -fバージョンと異なるかどうか知っていますか?
フェリペレアン14年

1
@StéphaneChazelasまあ、私の答えにはたくさんの間違いがあります。それらを指摘してくれてありがとう。正解を投稿してもらえますか。私は削除しますか?(そうでなければ、...私はエラーを修正しますが、それは私の長いToDoリストへタックし、より多くの作業です)
ジル「を悪であることを停止SO-」

17

tl; dr readlink -f0、既存のディレクトリに存在しないファイルに対して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

利用可能

readlinkほとんどのLinuxディストリビューション内にインストールされます。一方、realpath多くの場合、明示的にインストールする必要があります。

要約すれば

の呼び出しを置き換える場合は、realpath ...を使用しますreadlink -e ...


Ubuntu 16 でreadlink(GNU coreutils)8.21およびrealpathバージョン1.19でテスト済み。

Ed .: @AnthonyGeogheganは、「これはDebianバージョンのことを指しますrealpathrealpathreadlink -f。GNU バージョンの動作は同じです」)


3
この答えを支持しましたが、これがDebianバージョンのを指していることを明確にすることをお勧めしrealpathます。のGNUバージョンはrealpathと同じ動作をしreadlink -fます。
アンソニーG-モニカの正義

2
これがMacOS High Sierraで機能しないことを確認できます。
Pred
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.