代码之家  ›  专栏  ›  技术社区  ›  jameshfisher

如何将当前工作目录设置为脚本的目录?

  •  427
  • jameshfisher  · 技术社区  · 14 年前

    我在写Bash脚本。我需要当前工作目录始终是脚本所在的目录。

    默认行为是脚本中的当前工作目录是运行它的shell的目录,但我不希望出现这种行为。

    10 回复  |  直到 4 年前
        1
  •  762
  •   ndim    7 年前
    #!/bin/bash
    cd "$(dirname "$0")"
    
        2
  •  345
  •   Richard    6 年前

    以下方法也适用:

    cd "${0%/*}"
    

    语法在中有详细描述 this StackOverflow回答。

        3
  •  208
  •   kenorb    5 年前


    对于所有UNIX/OSX/Linux

    dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
    

    猛击

    dir=$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)
    

    注意:命令中使用双破折号(-)表示命令选项的结束,因此包含破折号或其他特殊字符的文件不会中断命令。

    ${BASH_SOURCE[0]} 赞成 $0 ,否则路径在寻源时可能会中断( source . ).


    对于Linux、Mac和其他*BSD:

    cd "$(dirname "$(realpath "$0")")";
    

    注: realpath 默认情况下应该安装在最流行的Linux发行版中(比如Ubuntu),但是在某些版本中可能会丢失它,所以您必须安装它。

    ${BASH\u源代码[0]} $0 ,否则路径在寻源时可能会中断( 来源 / . ).

    否则,您可以尝试类似的操作(它将使用第一个现有工具):

    cd "$(dirname "$(readlink -f "$0" || realpath "$0")")"
    

    cd "$(dirname "$(readlink -f "$0")")"
    

    cd "$(dirname "$(greadlink -f "$0")")"
    

    注意:您需要 coreutils 安装 (例如1。安装 Homebrew , 2. brew install coreutils ).


    在bash中可以使用 Parameter Expansions 为了达到这个目的,比如:

    cd "${0%/*}"
    

    或者,您可以在bash中定义以下函数:

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

    此函数接受1个参数。如果参数已经有绝对路径,则按原样打印,否则按原样打印 $PWD ./ 前缀)。

    .bashrc 文件:

    function realpath()
    {
        f=$@
        if [ -d "$f" ]; then
            base=""
            dir="$f"
        else
            base="/$(basename "$f")"
            dir=$(dirname "$f")
        fi
        dir=$(cd "$dir" && /bin/pwd)
        echo "$dir$base"
    }
    

    相关:

    另请参见:

    How can I get the behavior of GNU's readlink -f on a Mac?

        4
  •  82
  •   John Kugelman Michael Hodel    6 年前
    cd "$(dirname "${BASH_SOURCE[0]}")"
    

        5
  •  8
  •   James McGuigan    6 年前

    公认的答案适用于没有在其他地方进行符号链接的脚本,如into $PATH .

    #!/bin/bash
    cd "$(dirname "$0")"
    

    ln -sv ~/project/script.sh ~/bin/; 
    ~/bin/script.sh
    

    这将把cd放入 ~/bin/ ~/project/ 目录,如果 cd 是包含相对于 ~/项目/

    symlink安全答案如下:

    #!/bin/bash
    cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
    

    readlink -f 解析潜在符号链接文件的绝对路径时需要。

    需要引号来支持可能包含空格的文件路径(不好的做法,但假设不是这样是不安全的)

        6
  •  4
  •   Amardeep AC9MF    14 年前

    这个剧本似乎对我很有用:

    #!/bin/bash
    mypath=`realpath $0`
    cd `dirname $mypath`
    pwd
    

        7
  •  2
  •   Community CDub    7 年前

    获取脚本的真实路径

    if [ -L $0 ] ; then
        ME=$(readlink $0)
    else
        ME=$0
    fi
    DIR=$(dirname $ME)
    

    (这是我在这里提出的同一个问题的答案: Get the name of the directory where a script is executed

        8
  •  2
  •   Robert Hu    4 年前

    我拿着这个就行了。

    #!/bin/bash
    cd "$(dirname "$0")"
    CUR_DIR=$(pwd)
    
        9
  •  1
  •   user742030 user742030    9 年前
    cd "`dirname $(readlink -f ${0})`"
    
        10
  •  0
  •   Binary Phile    3 年前

    大多数答案要么不处理通过相对路径进行符号链接的文件,要么不是一行程序,要么不处理BSD(Mac)。解决这三个问题的方法是:

    HERE=$(cd "$(dirname "$BASH_SOURCE")"; cd -P "$(dirname "$(readlink "$BASH_SOURCE" || echo .)")"; pwd)
    

    首先,将cd转换为bash对脚本目录的概念。然后readlink文件查看它是否是一个符号链接(相对的或其他的),如果是,cd到那个目录。如果没有,cd到当前目录(保持一行的东西是必要的)。然后通过 pwd .

    你可以加上 --

    https://www.binaryphile.com/bash/2020/01/12/determining-the-location-of-your-script-in-bash.html

        11
  •  -5
  •   Julian    7 年前
    echo $PWD
    

    PWD是一个环境变量。

        12
  •  -7
  •   Keith Smiley    11 年前

    如果您只需要打印当前的工作目录,那么您可以按照以下步骤操作。

    $ vim test
    
    #!/bin/bash
    pwd
    :wq to save the test file.
    

    chmod u+x test
    

    然后执行脚本 ./test