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

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

Debianスクイーズ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"                                                                                                                                                                          
}           

答え1

次のプログラムが複数ありますrealpath

  • 当時GNU coreutilsに含まれていなかった古いプログラムreadlink -fです。これで廃止されたため、readlink -f多くのディストリビューションではこのプログラムをサポートしていません。
  • このrealpathプログラムはGNU coreutils 8.15で導入されました。この記事を書いた時点では、Debian で圧縮するには古すぎます。Debian の不安定バージョンもこれを提供しません。。このプログラムは非常に近いですreadlink -f

何らかの理由で部分的にエミュレートされたシェル関数がありますrealpath。このエミュレーションは部分的です。シンボリックリンクから呼び出すと、シンボリックリンクに従わない。

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

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

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

答え2

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

realpathそのため、パッケージからインストールするか、独自の機能を定義してください(スクリプトの一部として一部を確認してください)。はい)またはソースRCスクリプトでそれを定義するファイルです. ~/.bashrc


realpath存在しない場合は、次の手順に従ってインストールしてください。

  • Ubuntu:sudo apt-get install coreutils
  • オペレーティングシステム:brew install coreutils

Ubuntuとダーバン

realpathDebianやUbuntuではデフォルトでインストールする必要があるようです。最近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

次に、仮想マシンで次の操作を行います。

$ type -a realpath
realpath is /usr/bin/realpath

これに加えて、パッケージが提供する(または)realpathを使用できます。readlink -f filegreadlinkcoreutils

答え3

realpathは実際のコマンドかスクリプトですか?どこから出てくるのか確認してみましょう。

$ type -a realpath

私はこのツールに慣れていないので、通常のディストリビューションの一部ではないかもしれませんが、Bashには存在しませんが、$PATHログイン環境の$PATH

それにもかかわらず、上記のtypeコマンドソースは、次のようにスクリプトでコマンドを呼び出す方法を変更できる場所に表示されます。

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

$PATHまたは、この非標準の場所も含めるようにスクリプトを変更してください。

シェルの機能

シェルスクリプトを呼び出すと、ほとんどの環境は呼び出されません。考えてみると、通常、スクリプトがユーザーエクスペリエンスに存在する可能性のある追加の手荷物のすべてを含めたくないので、これは意味があります。

この機能を提供するソースファイルを確認してインポートするか、Bashにログイン環境をマージするように指示できます。

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

答え4

$ sudo apt-get install realpath

関連情報