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

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

realpath私はこのコマンドとそれがもう使われておらず、readlink -f今推奨される方法についてたくさん読んでいます。また、readlinkにこれらの機能が不足してrealpathが導入されたところもあり、一度導入されるとrealpathはもはや必要なくなり、ほとんどのオペレーティングシステムベンダーはこれをサポートしません。

readlink -f私が質問した理由は、私も「非常に似ている」コマンドで推薦する人をたくさん見ましたrealpath。実際の違いは何ですか?

答え1

周辺にはいくつかのコマンドがありますrealpath

このrealpathユーティリティはラッパーです。realpathライブラリ機能は何度も再作成されました。移流

Debianは一度realpathパック(分離~からdwww~から愚かな)は2001年以来、パッケージングと文書化を除いて変更されておらず、現在段階的に廃止されています。現在、より多くの標準的な選択肢(GNUreadlinkとまもなくGNU)があるので、このユーティリティはもう使用されていませんが、realpath当時はGNUユーティリティはreadlinkまったく存在しませんでした。この実装はrealpath一部をサポートします。optionsシンボリックリンクがヌル終了出力を確認または生成するのを防ぎます。 忙しい箱自分のものを含むrealpathコマンド(オプションなし)

GNUコアツール紹介したrealpathコマンド入力バージョン 8.152012年1月。これはBusyBoxやDebianと互換性のある代替手段であり、realpathGNUと同じオプションがたくさんあります。readlink

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

GNU はrealpath廃止されました。逆の問題があります。 GNUはあまりにも新しく、どこでも利用できません。 DebianはGNU 省略realpathそれからcoreutils荷物を包んで自分で捕まえてくださいrealpath。なぜなのかわかりません。 GNUはrealpathすぐに代用できる必要があるからです。しかし、Debian jessieとUbuntu 16.04以降はrealpathGNUが使用されています。

現在、Linuxシステムでシンボリックリンクを含めることができるパスを正規化するための最良のオプションはですreadlink -f

BSDシステムではreadlinkGNUとは機能が異なるコマンドですreadlink。特に、BSDにはreadlinkパスを正規化するオプションはなく、渡されたシンボリックリンクのみを通過します。

readlinkところで、同じ問題 - それも同じです。何度も発明(Unixにシンボリックリンクを追加するときにこのユーティリティが追加されていないのは残念です。)現在、多くの互換性のないフラグを持つ複数の実装(特にBSD対GNU)で安定しています。

答え2

長すぎます。 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

realpathディレクトリが存在しません

$ realpath /tmp/non-existent-dir/foo
$ echo $?
1

有効性

readlinkほとんどのLinuxディストリビューションにインストールされます。一方、realpath次のようにインストールすることがますます一般化されています。realpath参加しましたGNU Coreutils(以前は別個のパッケージでした)。

要するに

通話を交換したい場合はrealpath ...を使用してくださいreadlink -e ...
しかし、その展開がますます普及しているので、インストールrealpathを期待するのは無理ではありません。realpath

MMV readlink実装は非常に多様です。
MMV realpathデフォルトのLinuxインストールの可用性率readlink


試験用readlink(GNU coreutils) 8.21そして物理パスバージョン1.19Ubuntu 16で。


編集者ノート

答え3

readlink -freadlink -e他の回答で述べたように、または(配布パネルに応じて)の機能はの機能と同じである可能性がありますrealpath。ただし、realpathこのユーティリティは同じではありませんreadlink。たとえば、readlinkシンボリックリンクファイルの内容(その中のリテラルテキスト)を読み取ったり検索したりできます。

> ln -s "I am cold" slfile
> readlink slfile
I am cold

これはrealpathできません。

結局のところ、シンボリックリンクファイルは、ディレクトリ/ファイル階層内を移動するための「レシピ」と解釈されるテキストファイルです。しかし、それでもテキストファイルです。たとえば、その内容(readlink返されるもの)は操作可能でなければなりませんsed -i '...' slfile。実際には、オプションはシンボリックリンクを--follow-symlinks強制的にsed -i従うようにすることです。現在の設定(OpenSuSe 15.3のデフォルト、GNU sed 4.4、GNU bashバージョン4.4.23(1))でこの機能が機能しないため、「should」と書いてください。sed -iそのオプションがない場合は、--follow-symlinksまだファイルをシンボリックリンクしたいと思います。道。

関連情報