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

偶尔善良 提交于 2020-02-25 19:50:46

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

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


#1楼

cd "$(dirname "${BASH_SOURCE[0]}")"

这很容易。 有用。


#2楼

以下内容也适用:

cd "${0%/*}"

语法中充分地阐述这个 StackOverflow的答案。


#3楼

如果只需要打印当前的工作目录,则可以按照此步骤进行。

$ vim test

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

授予执行权限:

chmod u+x test

然后通过./test执行脚本,您可以看到当前的工作目录。


#4楼

尝试以下简单的一线:


对于所有UNIX / OSX / Linux

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

重击

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

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

注意:在bash,使用${BASH_SOURCE[0]}赞成$0 ,否则路径可以采购它时破裂( source / . )。


对于Linux,Mac和其他* BSD:

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

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

注意:如果你正在使用bash,使用${BASH_SOURCE[0]}赞成$0 ,否则路径可以采购时,它打破( source / . )。

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

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中,您可以使用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"
}

有关:

也可以看看:

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


#5楼

cd "`dirname $(readlink -f ${0})`"
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!