Bash script absolute path with OS X Bash script absolute path with OS X bash bash

Bash script absolute path with OS X


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

  1. Install Homebrew
  2. brew install coreutils
  3. grealpath .

(3) may be changed to just realpath, see (2) output


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/bashrealpath() {    [[ $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.


I found the answer 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).

This answer was previously edited, re-adding the local bashism. The point of this answer is a portable, POSIX solution. I have edited it to address variable scoping by changing it to a subshell function, rather than an inline one. Please do not edit.

#!/bin/shrealpath() (  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.