1. ホーム
  2. macos

[解決済み] MacでGNUのreadlink -fの動作を得るにはどうしたらいいですか? [クローズド]です。

2022-02-14 06:30:37

質問

Linuxでは readlink ユーティリティは、オプション -f を追加しています。これは、MacやおそらくBSDベースのシステムでは動作しないようです。同等のものは何でしょうか?

デバッグ情報です。

$ which readlink; readlink -f
/usr/bin/readlink
readlink: illegal option -f
usage: readlink [-n] [file ...]

解決方法は?

readlink -f は2つのことをします。

  1. 実際のファイルを見つけるまで、一連のシンボリックリンクにそって反復します。
  2. そのファイルの 正規化された という名前、つまり絶対パス名です。

もし必要なら、バニラ・リードリンクの動作を利用したシェルスクリプトを作成するだけで、同じことが実現できます。 以下はその例である。 もちろん、これを自分のスクリプトに挿入して readlink -f

#!/bin/sh

TARGET_FILE=$1

cd `dirname $TARGET_FILE`
TARGET_FILE=`basename $TARGET_FILE`

# Iterate down a (possible) chain of symlinks
while [ -L "$TARGET_FILE" ]
do
    TARGET_FILE=`readlink $TARGET_FILE`
    cd `dirname $TARGET_FILE`
    TARGET_FILE=`basename $TARGET_FILE`
done

# Compute the canonicalized name by finding the physical path 
# for the directory we're in and appending the target file.
PHYS_DIR=`pwd -P`
RESULT=$PHYS_DIR/$TARGET_FILE
echo $RESULT

これはエラー処理を含んでいないことに注意してください。 特に重要なのは、シンボリックリンクのサイクルを検出しないことです。 これを行う簡単な方法は、ループを回る回数を数えて、1,000などというありえないほど大きな数になったら失敗するようにすることでしょう。

を使用するように編集されました。 pwd -P の代わりに $PWD .

このスクリプトは、次のように呼び出されることを想定していることに注意してください。 ./script_name filename はありません。 -f 変更 $1$2 と併用できるようにしたい場合は -f filename GNU readlinkのように。