私は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"
}
Realpathは実際のコマンドまたはスクリプトですか?私はそれがどこから来ているのかを確認します。
$ type -a realpath
私はこのツールに慣れていないため、通常のディストリビューションには含まれていない可能性があります。おそらく、Bashの$PATH
にはないが、ログイン環境の$PATH
内にある非標準の場所にインストールされています。
いずれの場合でも、上記のtype
コマンドは、コマンドの送信元を示します。この時点で、スクリプトで呼び出すメソッドを次のように変更できます。
echo $(/path/to/realpath test.sh)
または、スクリプトの$PATH
を修正して、この非標準の場所も含めるようにします。
シェルスクリプトを呼び出しても、環境のほとんどは呼び出されません。これについて考えるなら、これは非常に理にかなっています。ユーザーの環境が持つ可能性があるすべての追加の手荷物をスクリプトに持たせたくないからです。
この機能を提供しているソースファイルを特定してソースを指定するか、単にログイン環境を組み込むようにBashに指示することができます。
#!/bin/bash -l
echo $(realpath "$1")
realpath
と呼ばれる少なくとも2つのプログラムがあります。
readlink -f
が含まれていなかった時代からの古いプログラム。現在はreadlink -f
に置き換えられて非推奨となったため、多くのディストリビューションはその実行を停止しました。realpath
プログラム。これは古すぎるため、Debian squeezeやwheezyに含めることはできません。執筆時点では、 Debian不安定版はtいずれか 。このプログラムはreadlink -f
に非常に近いです。何らかの理由で、realpath
の動作を部分的にエミュレートするシェル関数があります。このエミュレーションは部分的です。シンボリックリンクで呼び出すと、シンボリックリンクをたどりません。
これはシェル関数であり、おそらく.bashrc
から、または経由してロードされるため、インタラクティブシェルで実行されているコードでのみ使用できます。他のプログラムで使用できるようにするには、Linuxを実行していると想定して、realpath
をエミュレートするスクリプトを作成します。
#!/bin/sh
readlink -f -- "$@"
(これはrealpath
のほとんど使用されないコマンドラインオプションをエミュレートしません。)
スクリプトファイルはスコープが異なり、rcファイルで定義されたローカル関数とエイリアスにアクセスできないため、シェルでのみ機能します。そして、realpath
コマンドは実際にはシステムに存在しません。
したがって、パッケージからrealpath
をインストールするか、独自の関数を定義するか(スクリプトの一部として、いくつかの examples を確認してください)、またはrc定義されているスクリプト内のファイル(例:. ~/.bashrc
)。
realpath
が存在しない場合にインストールする手順は次のとおりです。
Sudo apt-get install coreutils
brew install coreutils
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
)を使用することもできます。
$ Sudo apt-get install realpath