为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁花不似锦 2020-02-03 14:58:29
我正在写一个bash脚本。我需要当前的工作目录始终是脚本所在的目录。默认行为是脚本中的当前工作目录是运行它的外壳程序的目录,但是我不希望出现这种情况。
查看完整描述

3 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

#!/bin/bash

cd "$(dirname "$0")"


查看完整回答
反对 回复 2020-02-03
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

以下内容也适用:


cd "${0%/*}"


查看完整回答
反对 回复 2020-02-03
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

尝试以下简单的一线:


对于所有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"

}


查看完整回答
反对 回复 2020-02-03
  • 3 回答
  • 0 关注
  • 763 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信