Bash 怎样获得脚本所在的绝对路径?

目前题主采用的方法如下(绝对路径,排除所有软链接):

#!/bin/bash

SCRIPT_PATH=`cd "$(dirname "$0")"; pwd -P`
echo ${SCRIPT_PATH}
cd ${SCRIPT_PATH}

这个方法存在下列问题:

  1. 路径不能包含非 ASKII 字符(例如:中文)
  2. 路径不能包含 Bash 特殊字符(例如:$、\)
  3. 路径不能包含空白(例如:空格、制表符)

请提供一种方法避免上述问题。

测试方法:

  • 将修改下列脚本,然后放到这里:你的路径/中文 English $/中文 English $.sh。执行不报错。
  • 最好能在 Windows(Windows Subsystem for Linux)、macOS 和 Linux 上均做测试。
#!/bin/bash

# 修改此处
#
# SCRIPT_PATH=
echo ${SCRIPT_PATH}
cd ${SCRIPT_PATH}

PS: 用cd ${SCRIPT_PATH}进行测试的原因是,确保${SCRIPT_PATH}可以安全地用作任意命令和脚本的参数。

阅读 4.4k
3 个回答

试试这个吧,Windows上没试过(因为没有)

#! /bin/sh
echo "$(cd "$(dirname "$1")"; pwd -P)/$(basename "$1")"

realpath也可以:

SCRIPT=`realpath $0`
SCRIPTPATH=`dirname $SCRIPT`

如果不想追踪软连接,可以加-s参数:

SCRIPT=`realpath -s $0`
SCRIPTPATH=`dirname $SCRIPT`

@Yujiaao 你的答案算是提示我了。

需要当作命令参数使用的地方,加上双引号(")即可。

#!/bin/bash

SCRIPT_PATH=`cd "$(dirname "$0")"; pwd -P`
echo ${SCRIPT_PATH}
cd "${SCRIPT_PATH}"
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题