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


24

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"                                                                                                                                                                          
}           

回答:


9

realpathは実際のコマンドですか、それともスクリプトですか?私はそれがどこから来たのかを確認するでしょう。

$ type -a realpath

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

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

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

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

シェルの機能

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

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

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

これは関数です。編集を参照してください
フランシス

@Francis-はい、スクリプトを呼び出すときに関数は含まれていません。一緒に来て欲しいなら、それらを調達する必要があります。どのファイルが機能を提供しているかを調べて、それをソースします。単に環境全体が必要な場合。次に、bashへの呼び出しを修正します#!/bin/bash -l
slm

この関数がどこから来たのかを知るにはどうすればよいですか?
フランシス

1
@mikeserv-ありがとう、これを書いたとき、私はまだFedora 14を使用していましたが、これには含まれていませんでしたrealpath。私のFedora 19システムには現在、このツールが含まれています。また、OPがDebian w / 2.6カーネルを使用していたことにも注意してくださいrealpath。そのため、彼のシステムも古くなって行方不明になりました。
slm

1
@mikeserv-ええ、私は驚きました。これは今では古めかしい質問ですが、情報commandはまだ役に立ちました。これは、POSIXシェル全体で示していたことを行うための、より移植性の高い方法です。
slm

27

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

  • GNU coreutilsに含まれていなかった古いプログラムreadlink -f。現在はの代わりに非推奨になっているreadlink -fため、多くのディストリビューションがその提供を停止しています。
  • realpathGNUで導入されたプログラムは、8.15をcoreutilsの。これは古すぎてDebianのスクイーズやwheezyにはなりません。執筆時点では、Debian不安定版もそれを出荷していません。このプログラムは非常に近いreadlink -fです。

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

これはシェル関数であり、おそらくから、またはを介してロードされる.bashrcため、対話型シェルで実行されているコードでのみ使用できます。Linuxを実行していると仮定して、他のプログラムで使用できるようにする場合は、エミュレートするスクリプトを作成しますrealpath

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

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


2
coreutils git repoで、realpathプログラムがcoreutilsによって非推奨であると見なされる、またはデフォルトでビルドされないという証拠を見つけることができません。したがって、Debianは削除する必要があります。
カズ

@Kazああ、まあ、問題を複雑にするために、coreutils(8.15)は最近realpathバイナリを導入しましたreadlink -f。Debian安定版は8.13を搭載しています。Debian不安定版は、レガシープログラムを保持することを選択しました
ジル 'SO-悪であるのをやめる' 14

それはなかったこと、それは月2012年だった-最近savannah.gnu.org/forum/forum.php?forum_id=7076
mikeserv

1
@mikeserv質問(Debian squeeze)のディストリビューションとしてはあまりにも最近です。現在のDebian安定版にとってはあまりにも最近のことです。
ジル 'SO-悪であるのをやめる' 14

それはちょっと怖いです。彼らはopenssl何歳ですか?
mikeserv 14

8

スクリプトファイルは異なるスコープを持ち、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ます。


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