Help us understand the problem. What is going on with this article?

Macでもreadlink -f

More than 5 years have passed since last update.

readlinkは、引数のパスがシンボリックリンクならリンク先を出力し、そうでなければ何も出力しない。

GNU readlinkの"-f"オプションはシンボリックリンクがいくつ連なってても実体のパスを出力してくれる。

MacはGNU版ではないので"-f"がない。

homebrewでcoreutilsをインストールしてreadlinkをGNU版のcoreutilsへのエイリアスにするという方法もあるみたいだけど、配布するにはつらいので、インストールしないでも良い方法を探した。

http://stackoverflow.com/questions/1055671/how-can-i-get-the-behavior-of-gnus-readlink-f-on-a-mac

再帰的にreadlinkしているだけなので素のreadlinkを使ってシェルスクリプトで実装できるよというわけで、こういうコードが貼られていた。

#!/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

せっかくなので短くしてみた。例外処理が甘いけど元のやつもなので気にしない。

#!/bin/sh

TARGET_FILE=$1

while [ "$TARGET_FILE" != "" ]; do
    cd `dirname $TARGET_FILE`
    FILENAME=`basename $TARGET_FILE`
    TARGET_FILE=`readlink $FILENAME`
done

echo `pwd -P`/$FILENAME

おまけ

自身の実体を出力するシェルスクリプト。

#!/bin/sh

# emulate GNU readlink's "readlink -f" behavior on Mac
# http://stackoverflow.com/questions/1055671/how-can-i-get-the-behavior-of-gnus-readlink-f-on-a-mac
function __readlink_f {
  TARGET_FILE=$1

  while [ "$TARGET_FILE" != "" ]; do
      cd `dirname $TARGET_FILE`
      FILENAME=`basename $TARGET_FILE`
      TARGET_FILE=`readlink $FILENAME`
  done

  echo `pwd -P`/$FILENAME
}

self=`__readlink_f $0`
echo $self
uzabase
企業活動の意思決定を支える情報インフラの提供
https://www.uzabase.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away