How to expand relative paths in shell script

前端 未结 7 1249
春和景丽
春和景丽 2021-02-06 21:49

I am writing a script to set environment variables on linux 2.6 using bash. So the script contains commands like:

export SRC_DIR=..
export LIBPATH=${SRC_DIR}/lib         


        
相关标签:
7条回答
  • 2021-02-06 22:34

    Do this instead:

    export SRC_DIR=`pwd`;
    

    Update:

    Since you want path relative to the script's location on the filesystem, use this instead:

    export SRC_DIR=`dirname $0`
    

    Update2:

    Your script must be invoked directly and not as bash /path/to/script.sh or source foo.sh. Add a shebang line, add execute permissions and invoke the script directly.

    0 讨论(0)
  • 2021-02-06 22:35

    The readlink command is capable of not only resolving symlinks, but also canonicalizing relative paths. Be careful, since you may not want the behaviour of resolving symlinks in all your scripts. If you don't want to resolve symlinks, pwd would be the best; note the use of a subshell, so the cd command does not affect the working directory in the main shell.

    # The path you want to get information on... (for readability)
    your_path=..
    
    # Using /bin/readlink (resolves symlinks)
    export SRC_DIR=$(readlink --canonicalize $your_path)
    
    # Using /usr/bin/dirname (keeps symlinks)
    export SRC_DIR=$(cd $your_path ; pwd)
    
    0 讨论(0)
  • 2021-02-06 22:40

    Digging up this old thread to add what i've found to work nicely:

    export SRC_DIR = `realpath ..`

    see more information here:

    http://man7.org/linux/man-pages/man3/realpath.3.html

    0 讨论(0)
  • 2021-02-06 22:43

    For keeping error code:

    function getPwd() {
        $(cd $1; [[ $? -ne 0 ]] && exit 1 || echo echo $PWD;)
        return $?
    }
    
    0 讨论(0)
  • 2021-02-06 22:47

    I usually use

    SCRIPT_DIR=$(readlink -f ${0%/*})
    

    It should return the full path to the script, and even resolves all the links along the way.

    0 讨论(0)
  • 2021-02-06 22:51

    Change Directory in Subshell

    There's a little trick you can use to get the absolute path from a relative path without changing the present working directory. The trick is to move to the relative path in a subshell, and then expand the working directory. For example:

    export SRC_DIR=$(cd ..; pwd)
    

    Relative Paths from Script Instead of Invocation Directory

    To change to a relative path from a script's location, rather than the current working directory, you can use a parameter expansion or the dirname utility. I prefer dirname, since it's a little more explicit. Here are both examples.

    # Using /usr/bin/dirname.
    export SRC_DIR=$(cd "$(dirname "$0")/.."; pwd)
    
    # Using the "remove matching suffix pattern" parameter expansion.
    export SRC_DIR=$(cd "${0%/*}/.."; pwd)
    
    0 讨论(0)
提交回复
热议问题