web-dev-qa-db-ja.com

バッシュ:シンボリックリンクの実際のパスを取得する方法?

/ usr/local/binフォルダーにシンボリックリンクされたファイルを実行して、元のスクリプトの絶対パスを取得することは可能ですか?まあ、..元のファイルがどこにあるか知っているし、リンクしているのでわかっている。しかし、...元のソースコード(およびシンボリックリンク)を移動した場合でも、このスクリプトを機能させる必要があります。

#!/bin/bash
echo "my path is ..."
14
sensorario

readlinkは標準コマンドではありませんが、LinuxおよびBSD(OS Xを含む)で一般的であり、質問に対する最も簡単な答えです。 BSDとGNU readlinkの実装は異なるため、お持ちのドキュメントをお読みください。

readlinkが利用できない場合、または特定の実装にバインドされていないクロスプラットフォームスクリプトを記述する必要がある場合:

シンボリックリンクもディレクトリの場合、

cd -P "$symlinkdir"

逆参照されたディレクトリに移動するので、

echo "I am in $(cd -P "$symlinkdir" && pwd)"

完全に逆参照されたディレクトリをエコーし​​ます。つまり、cd -Pはパス全体を逆参照するため、同じパスに複数のシンボリックリンクがある場合、予期しない結果が生じる可能性があります。

シンボリックリンクがディレクトリではなくファイルに対するものである場合は、リンクを逆参照する必要がない場合があります。ほとんどのコマンドは、無害にシンボリックリンクをたどります。ファイルがリンクであるかどうかを確認するだけの場合は、test -Lを使用します。

21
kojiro

実際のスクリプトまたはファイルとそれにシンボリックリンクがあるとします。

$ ls -la
-rwxr-xr-x 1 root    root  0 Mar 20 07:05 realscript.sh
lrwxrwxrwx 1 root    root 10 Mar 20 07:05 symlink -> realscript.sh

また、GNU coreutilsの部分は、非常に便利なコマンドの一部です。

$ realpath symlink
/home/test/realscript.sh

オリジナルも参照:

realpath realscript.sh
/home/test/realscript.sh

また、スクリプトでの非常に良い組み合わせは、保存されたファイルでdirnameを使用することです

$ dirname /home/test/realscript.sh
/home/test

まとめると、スクリプトで使用できます

echo  $( dirname $(realpath "symlink") )

または、変数の実際のスクリプトのホームディレクトリを取得して保存します。

script_home=$( dirname $(realpath "$0") )
echo Original script home: $script_home

すべてをテストするために、シンボリックリンクを/ home/test2 /に入れ、いくつかの追加事項を修正して、ルートディレクトリから実行/呼び出しします。

/$ /home/test2/symlink
/home/test
Original script home: /home/test
Original script is: /home/test/realscript.sh
Called script is: /home/test2/symlink

修正した出力を自分で書いてみてください:)

7

linuxで作業している場合readlink -f $LINKおよびMacでは、これを使用することもできますgreadlink -f $LINK