确定执行BASH脚本的路径

Ati*_*ziz 105 bash

可能重复:
Bash脚本可以告诉它存储在哪个目录中吗?

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

@echo Running from %~dp0
Run Code Online (Sandbox Code Playgroud)

什么是BASH脚本中的等价物?

vla*_*adr 151

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

MY_PATH="`dirname \"$0\"`"
echo "$MY_PATH"
Run Code Online (Sandbox Code Playgroud)

对于绝对的规范化路径:

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"
Run Code Online (Sandbox Code Playgroud)

  • 在大多数情况下,$ 0就可以了,例如,当你执行的脚本是别名时(通过.bash_profile中的别名),有些例外.你应该使用$ BASH_SOURCE变量,而不是$ 0. (4认同)
  • 当我通过符号链接执行脚本时,对我不起作用.是否有一个变体可以确定完全解析的脚本目录?编辑:`$(dirname $(readlink $ 0))`似乎工作 (4认同)
  • 在 bash 中,您还可以使用“$BASH_SOURCE”。来自[这篇文章](http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored-in)。 (2认同)
  • 使用`source script`或`运行脚本时,使用`$ 0`不起作用.script`; 脚本的名称不可用. (2认同)

Ale*_*lds 22

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

#!/bin/bash
echo "$0"
dirname "$0"
Run Code Online (Sandbox Code Playgroud)

示例输出:

$ /a/b/c/myScript.bash
/a/b/c/myScript.bash
/a/b/c
Run Code Online (Sandbox Code Playgroud)

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

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

  • 在bash中,您还可以使用`$ BASH_SOURCE`。从[本文](http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored-in)中。 (2认同)

Dim*_*lov 8

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"
Run Code Online (Sandbox Code Playgroud)

  • 嗨@vladr,上面的代码是POSIX!如果我理解正确,你的意思是代码不会运行旧的Bourne shell(例如Solaris <11上的/ bin/sh),但这与POSIX无关. (6认同)
  • @vladr,Bourne shell不符合POSIX标准,它早于POSIX标准.POSIX.1的标准化用户命令行和脚本接口基于Korn Shell.据我所知,所有商业Unices都提供符合POSIX标准的shell(例如,它是Solaris上的/ usr/xpg4/bin/sh). (3认同)

xag*_*gyg 6

echo Running from $(dirname "$0")
Run Code Online (Sandbox Code Playgroud)