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:
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