确定执行BASH脚本的路径

时间:2009-03-10 14:10:23

标签: bash

  

可能重复:
  Can a Bash script tell what directory it's stored in?

在Windows命令脚本中,可以使用%~dp0确定当前正在执行的脚本的目录路径。例如:

@echo Running from %~dp0

BASH脚本中的等效内容是什么?

5 个答案:

答案 0 :(得分:140)

对于相对路径(即Windows'%~dp0的直接等价物):

MY_PATH="`dirname \"$0\"`"
echo "$MY_PATH"

对于绝对的,标准化的路径:

MY_PATH="`dirname \"$0\"`"              # relative
MY_PATH="`( cd \"$MY_PATH\" && pwd )`"  # absolutized and normalized
if [ -z "$MY_PATH" ] ; then
  # error; for some reason, the path is not accessible
  # to the script (e.g. permissions re-evaled after suid)
  exit 1  # fail
fi
echo "$MY_PATH"

答案 1 :(得分:20)

假设您输入了bash脚本的完整路径,请使用$0dirname,例如:

#!/bin/bash
echo "$0"
dirname "$0"

示例输出:

$ /a/b/c/myScript.bash
/a/b/c/myScript.bash
/a/b/c

如有必要,请将$PWD变量的结果附加到相对路径。

编辑:添加引号来处理空格字符。

答案 2 :(得分:8)

由c.u.s.上的 Stephane CHAZELAS 供稿 假设POSIX shell:

prg=$0
if [ ! -e "$prg" ]; then
  case $prg in
    (*/*) exit 1;;
    (*) prg=$(command -v -- "$prg") || exit;;
  esac
fi
dir=$(
  cd -P -- "$(dirname -- "$prg")" && pwd -P
) || exit
prg=$dir/$(basename -- "$prg") || exit 

printf '%s\n' "$prg"

答案 3 :(得分:4)

echo Running from `dirname $0`

答案 4 :(得分:2)

弗拉德的代码被过度引用。应该是:

MY_PATH=`dirname "$0"`
MY_PATH=`( cd "$MY_PATH" && pwd )`