realpath
という名前のプログラムが少なくとも 2 つあります。 :
- GNU coreutils に
readlink -f
が含まれていなかった時代の古いプログラム .readlink -f
を支持して非推奨になりました 、非常に多くのディストリビューションがそれを運ぶのをやめました. realpath
GNU coreutils 8.15 で導入されたプログラム。これは古すぎて、Debian のスクイーズやウィージーにはなりません。これを書いている時点では、Debian 不安定版も同梱されていません。このプログラムはreadlink -f
に非常に近いです .
何らかの理由で、realpath
の動作を部分的にエミュレートするシェル関数があります。 .このエミュレーションは部分的です:シンボリック リンクで呼び出すと、シンボリック リンクをたどりません。
これはシェル関数であるため、おそらく .bashrc
から、または経由でロードされます 、対話型シェルで実行されているコードでのみ使用できます。 Linux を実行していると仮定して、他のプログラムで使用できるようにする場合は、realpath
をエミュレートするスクリプトを作成します。 :
#!/bin/sh
readlink -f -- "[email protected]"
(これは realpath
をエミュレートしません のめったに使用されないコマンド ライン オプションです。)
スクリプト ファイルのスコープが異なり、rc で定義されたローカル関数やエイリアスにアクセスできないため、シェルでのみ機能します。 ファイル。そして realpath
コマンドは実際にはシステムに存在しません。
realpath
をインストールするか パッケージから、独自の関数を定義する (スクリプトの一部として、いくつかの例を確認してください) か、rc をソースします。 ファイルが定義されているスクリプト内のファイル (例:. ~/.bashrc
).
realpath
をインストールする手順は次のとおりです。 存在しない場合:
- Ubuntu:
sudo apt-get install coreutils
- OS X:
brew install coreutils
Ubuntu &Debian
Debian または Ubuntu では realpath
のようです デフォルトでインストールする必要があります。最近の Debian 8 (Jessie) をチェックインしましたが、coreutils
があるようです デフォルトでインストールされます。
新しい VM イメージを使用してテスト済み:
$ vagrant init debian/jessie64 && vagrant up --provider virtualbox && vagrant ssh
$ vagrant init ubuntu/vivid64 && vagrant up --provider virtualbox && vagrant ssh
次に VM で:
$ type -a realpath
realpath is /usr/bin/realpath
realpath
の代わりに 、 readlink -f file
も使用できます (または greadlink
) coreutils
提供 パッケージも。
realpath は実際のコマンドですか、それともスクリプトですか?どこから来ているのか調べてみます.
$ type -a realpath
私はこのツールに詳しくないので、通常のディストリビューションの一部ではない可能性があります。おそらく、Bash の $PATH
に存在しない非標準の場所にインストールされている可能性があります。 ただし、ログイン環境の $PATH
内にあります .
いずれにせよ、上記の type
コマンドは、コマンドがどこから来ているかを示します。その時点で、スクリプトで呼び出しているメソッドを次のように変更できます。
echo $(/path/to/realpath test.sh)
または、スクリプトの $PATH
を修正します この非標準の場所も含まれるようにします。
シェル内の関数
シェル スクリプトを呼び出しても、環境の多くは呼び出されません。これについて考えると、これは非常に理にかなっています。なぜなら、一般に、ユーザーの環境が持つ可能性のあるすべての追加の荷物をスクリプトに持たせたくないからです。
どのソース ファイルがこの機能を提供しているかを判断してそれをソースするか、単純に Bash にログイン環境を組み込むように指示することができます。
#!/bin/bash -l
echo $(realpath "$1")