Bash script absolute path with OSX

I am trying to obtain the absolute path to the currently running script on OS X.

I saw many replies going for readlink -f $0 . However since OS X's readlink is the same as BSD's, it just doesn't work (it works with GNU's version).

Any suggestions for an out of the box solution to this?


There's a realpath() C function that'll do the job, but I'm not seeing anything available on the command-line. Here's a quick and dirty replacement:

#!/bin/bash

realpath() {
    [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}

realpath "$0"

This prints the path verbatim if it begins with a / . If not it must be a relative path, so it prepends $PWD to the front. The #./ part strips off ./ from the front of $1 .


These three simple steps are going to solve this and many other OSX issues:

  • Install Homebrew
  • brew install coreutils
  • grealpath .
  • (3) may be changed to just realpath , see (2) output


    Ugh. I found the prior answers a bit wanting for a few reasons: in particular, they don't resolve multiple levels of symbolic links, and they are extremely "Bash-y". While the original question does explicitly ask for a "Bash script", it also makes mention of Mac OS X's BSD-like, non-GNU readlink . So here's an attempt at some reasonable portability (I've checked it with bash as 'sh' and dash), resolving an arbitrary number of symbolic links; and it should also work with whitespace in the path(s), although I'm not sure of the behavior if there is white space the base name of the utility itself, so maybe, um, avoid that?

    #!/bin/sh
    realpath() {
      OURPWD=$PWD
      cd "$(dirname "$1")"
      LINK=$(readlink "$(basename "$1")")
      while [ "$LINK" ]; do
        cd "$(dirname "$LINK")"
        LINK=$(readlink "$(basename "$1")")
      done
      REALPATH="$PWD/$(basename "$1")"
      cd "$OURPWD"
      echo "$REALPATH"
    }
    realpath "$@"
    

    Hope that can be of some use to someone.

    链接地址: http://www.djcxy.com/p/1668.html

    上一篇: bash脚本获得完整路径的可靠方法?

    下一篇: Bash脚本绝对路径与OSX