1. ホーム
  2. バッシュ

[解決済み】シェルスクリプトのシンボリックリンクを解決する方法

2022-04-04 06:25:24

質問

Unix系システムで)絶対パスまたは相対パスが与えられたとき、中間シンボリックリンクを解決した後のターゲットのフルパスを決定したい。ボーナスポイントは、同時に~ユーザー名表記を解決することです。

ターゲットがディレクトリの場合、ディレクトリに chdir() してから getcwd() を呼び出すことができるかもしれませんが、私はこれを C ヘルパーを書くのではなく、シェルスクリプトから行いたいのです。残念ながら、シェルはシンボリックリンクの存在をユーザーから隠そうとする傾向があります(これはOS Xのbashです)。

$ ls -ld foo bar
drwxr-xr-x   2 greg  greg  68 Aug 11 22:36 bar
lrwxr-xr-x   1 greg  greg   3 Aug 11 22:36 foo -> bar
$ cd foo
$ pwd
/Users/greg/tmp/foo
$

上記の例でtmpディレクトリから実行したときにresolve("foo") == "/Users/greg/tmp/bar"というような関数 resolve() が欲しいのです。

どのように解決するのですか?

規格によると pwd -P はシンボリックリンクを解決したパスを返すべきです。

C関数 char *getcwd(char *buf, size_t size) から unistd.h は同じ動作をするはずです。

ゲットクォード pwd