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

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

默认行为是脚本中的当前工作目录是我从中运行它的shell的工作目录,但我不想要这种行为。


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

以下内容也有效:

cd "${0%/*}"

在这个StackOverflow答案中详细描述了语法。


试试以下简单的一行:


适用于所有UNIX / OSX / Linux

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

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


对于Linux,Mac和其他* BSD:

cd $(dirname $(realpath $0))

使用空格支持:

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

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

否则,你可以尝试类似的东西(它会使用第一个现有的工具):

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

对于Linux特定的:

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

在* BSD / Mac上使用GNU readlink:

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

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


在bash中

在bash中,您可以使用Parameter Expansions来实现该功能,如:

cd ${0%/*}

但如果脚本是从同一目录运行的,则它不起作用。

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

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

该函数需要1个参数。 如果参数已经有绝对路径,按原样打印它,否则打​​印$PWD变量+文件名参数(不带./前缀)。

或者这里是从Debian .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"
}

有关:

  • 如何检测我运行我的shell脚本的当前目录?

  • 从内部获取Bash脚本的源目录

  • Bash脚本绝对路径与OSX

  • bash脚本获得完整路径的可靠方法?

  • 也可以看看:

    如何在Mac上获得GNU的readlink -f的行为?

    链接地址: http://www.djcxy.com/p/25561.html

    上一篇: How to set current working directory to the directory of the script?

    下一篇: Create interrupt in bash by keys like ENTER Or ESC