web-dev-qa-db-ja.com

realpathコマンドが見つかりません

私はdebian squeeze AMD64を持っています。私の現在のシェルはbashです。私の端末で次のように書くと、うまくいきます:

$ uname -a
Linux core 2.6.32-5-AMD64 #1 SMP Fri May 10 08:43:19 UTC 2013 x86_64 GNU/Linux
$ echo $Shell
/bin/bash                                                                                                                                                                                     
$ echo $(realpath test.sh)                                                                                                                                                     
/home/ffortier/test.sh

私のtest.shファイルは次のようになります。

#!/bin/bash
echo $(realpath "$1")

以下を実行しようとすると、エラーが発生します

$ ./test.sh test.sh 
./test.sh: line 2: realpath: command not found

Bashファイル内でrealpathコマンドを使用するにはどうすればよいですか?

追加情報

$ type -a realpath
realpath is a function                                                                                                                                                                        
realpath ()                                                                                                                                                                                   
{                                                                                                                                                                                             
    f=$@;                                                                                                                                                                                     
    if [ -d "$f" ]; then                                                                                                                                                                      
        base="";                                                                                                                                                                              
        dir="$f";                                                                                                                                                                             
    else                                                                                                                                                                                      
        base="/$(basename "$f")";                                                                                                                                                             
        dir=$(dirname "$f");                                                                                                                                                                  
    fi;                                                                                                                                                                                       
    dir=$(cd "$dir" && /bin/pwd);                                                                                                                                                             
    echo "$dir$base"                                                                                                                                                                          
}           
26
Francis

Realpathは実際のコマンドまたはスクリプトですか?私はそれがどこから来ているのかを確認します。

$ type -a realpath

私はこのツールに慣れていないため、通常のディストリビューションには含まれていない可能性があります。おそらく、Bashの$PATHにはないが、ログイン環境の$PATH内にある非標準の場所にインストールされています。

いずれの場合でも、上記のtypeコマンドは、コマンドの送信元を示します。この時点で、スクリプトで呼び出すメソッドを次のように変更できます。

echo $(/path/to/realpath test.sh)

または、スクリプトの$PATHを修正して、この非標準の場所も含めるようにします。

シェルの機能

シェルスクリプトを呼び出しても、環境のほとんどは呼び出されません。これについて考えるなら、これは非常に理にかなっています。ユーザーの環境が持つ可能性があるすべての追加の手荷物をスクリプトに持たせたくないからです。

この機能を提供しているソースファイルを特定してソースを指定するか、単にログイン環境を組み込むようにBashに指示することができます。

#!/bin/bash -l
echo $(realpath "$1")
10
slm

realpathと呼ばれる少なくとも2つのプログラムがあります。

  • GNU coreutilsにreadlink -fが含まれていなかった時代からの古いプログラム。現在はreadlink -fに置き換えられて非推奨となったため、多くのディストリビューションはその実行を停止しました。
  • GNU coreutils 8.15で導入されたrealpathプログラム。これは古すぎるため、Debian squeezeやwheezyに含めることはできません。執筆時点では、 Debian不安定版はtいずれか 。このプログラムはreadlink -fに非常に近いです。

何らかの理由で、realpathの動作を部分的にエミュレートするシェル関数があります。このエミュレーションは部分的です。シンボリックリンクで呼び出すと、シンボリックリンクをたどりません。

これはシェル関数であり、おそらく.bashrcから、または経由してロードされるため、インタラクティブシェルで実行されているコードでのみ使用できます。他のプログラムで使用できるようにするには、Linuxを実行していると想定して、realpathをエミュレートするスクリプトを作成します。

#!/bin/sh
readlink -f -- "$@"

(これはrealpathのほとんど使用されないコマンドラインオプションをエミュレートしません。)

スクリプトファイルはスコープが異なり、rcファイルで定義されたローカル関数とエイリアスにアクセスできないため、シェルでのみ機能します。そして、realpathコマンドは実際にはシステムに存在しません。

したがって、パッケージからrealpathをインストールするか、独自の関数を定義するか(スクリプトの一部として、いくつかの examples を確認してください)、または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の代わりに、greadlinkパッケージで提供されるreadlink -f file(またはcoreutils)を使用することもできます。

10
kenorb
$ Sudo apt-get install realpath
5
user175315