それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

シェルスクリプトでファイル名のフルパス(リンク先でもリンク元ファイル名とれる)

シェルスクリプトでファイル名を取得するには、 $0 特殊変数を使います。

#!/usr/bin/env bash
echo パス名
echo $0

です。

やってみます

# cd /home/takuya/repos/bin
# ./test
パス名 
./test

パスが通ってる場合はフルパスが帰ります。

# export PATH=$PATH:/home/takuya/repos/bin
# test
パス名 
/home/takuya/repos/bin/test

リンク先で実行したら、

さて、ココからが本題。
上記のファイルをリンク先で実行したらどうなるのか?

# ln -s /home/takuya/repos/bin/test /usr/local/bin
# export PATH=$PATH:/usr/local/bin
# test
パス名 
/usr/local/bin/test
リンクファイル名が返ってくる

リンク元のファイルが実行されてるが、リンクしたファイル名として解釈されているようだ

正しいといえば正しいし、正しくないといえば正しくない。

常に、リンク元の元ファイル名を取得するにはどうするのか

realpathを使います

#!/usr/bin/env bash
echo パス名
echo $(realpath $0 )


realpath コマンドは、リンク先ファイルが引数指定された、リンク元のファイルを返してくれます。なのでコレで一件落着