/ usr/local/binフォルダーにシンボリックリンクされたファイルを実行して、元のスクリプトの絶対パスを取得することは可能ですか?まあ、..元のファイルがどこにあるか知っているし、リンクしているのでわかっている。しかし、...元のソースコード(およびシンボリックリンク)を移動した場合でも、このスクリプトを機能させる必要があります。
#!/bin/bash
echo "my path is ..."
readlink
は標準コマンドではありませんが、LinuxおよびBSD(OS Xを含む)で一般的であり、質問に対する最も簡単な答えです。 BSDとGNU readlinkの実装は異なるため、お持ちのドキュメントをお読みください。
readlink
が利用できない場合、または特定の実装にバインドされていないクロスプラットフォームスクリプトを記述する必要がある場合:
シンボリックリンクもディレクトリの場合、
cd -P "$symlinkdir"
逆参照されたディレクトリに移動するので、
echo "I am in $(cd -P "$symlinkdir" && pwd)"
完全に逆参照されたディレクトリをエコーします。つまり、cd -P
はパス全体を逆参照するため、同じパスに複数のシンボリックリンクがある場合、予期しない結果が生じる可能性があります。
シンボリックリンクがディレクトリではなくファイルに対するものである場合は、リンクを逆参照する必要がない場合があります。ほとんどのコマンドは、無害にシンボリックリンクをたどります。ファイルがリンクであるかどうかを確認するだけの場合は、test -L
を使用します。
実際のスクリプトまたはファイルとそれにシンボリックリンクがあるとします。
$ 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
修正した出力を自分で書いてみてください:)
linuxで作業している場合readlink -f $LINK
およびMacでは、これを使用することもできますgreadlink -f $LINK