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

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

蒲公英win7蒲公英win7提问于
leosslyc回答于

尝试以下简单的一行:

适用于所有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))

使用GNUreadlink*BSD/Mac:

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

注意:你需要coreutils已安装(例如1.安装Parameter Expansions,2.brew install coreutils)。

bash

在bash你可以用参数展开为了达到这个目标,比如:

cd ${0%/*}

但是,如果脚本是从同一个目录运行的,它就不能工作。

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

realpath () {
  [[ $1 = /* ]] && echo "$1" || echo "$PWD/${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"
}

回答过的其他问题

使用COS+CDN的静态内容加速可以实现云视频的服务吗?

已采纳
可以的,我没理解错的话。把视频上传到cos上面,然后获取cdn地址就可以。你后台要开启下 加速域名。 [图片] ... 展开详请

腾讯云时序数据库 CTSDB VS 传统时序数据库?

写入、存储、查询多环节优化,时序数据库优势明显 时序数据模型及特点:在引入时序数据库之前,先要了解【时序数据】的模型及特点。 时序数据的数学模型:前面介绍了时序数据的场景,也说明了分析时序数据的意义及传统方案。那么时序数据该怎样存储呢?数据的存储要考虑其数学模型和特点,时序数据当...... 展开详请

Java在云服务器上获取不到请求头参数?

短信群发支持0点发送吗?

自己写个定时任务 0点触发呗

https://cloud.tencent.com/document/product/382/13613

短信群发接口在哪里申请?

看看短信SDK 开发就OK

https://cloud.tencent.com/document/product/382/5804

如何用大数据构建用户画像?

用户特征的提取即用户画像的生产过程,大致可以分为以下几步: 1. 用户建模 2. 数据收集 3. 数据清理 4. 模型训练 5. 属性预测 6. 数据合并 7. 数据分发 ... 展开详请

关于作者

所属标签

扫码关注云+社区