Bash equivalent for PHP realpath()

By Andy

For all you PHP hackers trying to write a BASH script and looking for an equivalent for PHP’s realpath function, try readlink. It can expand symbolic links and resolve relative paths like “./” and “../”. In a shell script, try this:

MY_PATH=$(readlink -f $0)

Thanks to Barry.

Tags: ,

8 Responses to “Bash equivalent for PHP realpath()”

  1. CodeWord: Apokalyptik » Blog Archive » This deserves some link love Says:

    [...] bogged a piece of advice that I have him which I got from Barry… and if you want to know how to get the true absolute path to the real location of the current script is from inside of it (like phps realpath and __FILE__) I suggest you check it out Subscribe to the comments for this [...]

  2. Phil R Says:

    If you put quotation marks around the variable expansion you’ll be able to gracefully handle paths with spaces in them as well:

    MY_PATH=$(readlink -f “$0″)

  3. Ted Says:

    This was very appreciated for a shell script I’m building. Thank you!

  4. Anon Says:

    saddly, readlink on Mac OS X has almost a completely different implementation and this particular method doesn’t work. sigh. still looking around….

  5. openspecies Says:

    eval “expand_tild=$inputfile”
    MY_PATH=$(php -r “echo realpath(‘$expand_tild’);”)

  6. mmw Says:

    me again, or:
    #
    # This function expands ~ in pathname and
    # resolves the given path using perl or python or php realpath
    #
    function resolvepath () {
    if [[ "${1}" == \~*/* || "${1}" == \~ || "${1}" == \~/* || "${1}" == \~/ ]]; then
    p=”${HOME}${1:1:${#1}}”
    else
    p=”${1}”
    fi

    PYTHON_CMD=$(which python)
    PERL_CMD=$(which perl)
    PHP_CMD=$(which php)

    if [ ! -z "${PYTHON_CMD}" ]; then
    resolved_path=$(“${PYTHON_CMD}” -c ‘import os;print os.path.realpath(“‘”$p”‘”);’)
    elif [ ! -z "${PERL_CMD}" ]; then
    resolved_path=$(“${PERL_CMD}” -e ‘use Cwd qw(realpath);print realpath(“‘”$p”‘”);’)
    elif [ ! -z "${PHP_CMD}" ]; then
    resolved_path=$(“${PHP_CMD}” -r “echo realpath(‘$p’);”)
    fi #linux readlink -f
    }

  7. shingra Says:

    I’m afflicted with the darwin version of readlink. For one script I needed to be able to resolve paths of directories only, and the following solution did it for me.

    #!/bin/bash
    dir_resolve()
    {
    cd “$1″ 2>/dev/null || return $? # cd to desired directory; if fail, quell any error messages but return exit status
    echo “`pwd -P`” # output full, link-resolved path
    }

    # sample usage
    if abs_path=”`dir_resolve \”$1\”`”
    then
    echo “$1 resolves to $abs_path”
    echo pwd: `pwd` # function forks subshell, so working directory outside function is not affected
    else
    echo “Could not reach $1″
    fi

  8. onemyndseye Says:

    If you simply need to return the full path of the running script and you CAN use readlink… this one-liner should work well as long as its defined at the top of the script before the inital PWD changes.

    MY_PATH=$(readlink -f $(type -a $0 |awk ‘{print $3}’))

Leave a Reply