当前位置:  开发笔记 > 编程语言 > 正文

确定执行BASH脚本的路径

如何解决《确定执行BASH脚本的路径》经验,为你挑选了3个好方法。

对于相对路径(即直接等效的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"

在大多数情况下,$ 0就可以了,例如,当你执行的脚本是别名时(通过.bash_profile中的别名),有些例外.你应该使用$ BASH_SOURCE变量,而不是$ 0. (4认同)

当我通过符号链接执行脚本时,对我不起作用.是否有一个变体可以确定完全解析的脚本目录?编辑:`$(dirname $(readlink $ 0))`似乎工作 (4认同)

使用`source script`或`运行脚本时,使用`$ 0`不起作用.script`; 脚本的名称不可用. (2认同)


Alex Reynold.. 22

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

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

示例输出:

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

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

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



1> vladr..:

对于相对路径(即直接等效的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"


在大多数情况下,$ 0就可以了,例如,当你执行的脚本是别名时(通过.bash_profile中的别名),有些例外.你应该使用$ BASH_SOURCE变量,而不是$ 0.
当我通过符号链接执行脚本时,对我不起作用.是否有一个变体可以确定完全解析的脚本目录?编辑:`$(dirname $(readlink $ 0))`似乎工作
使用`source script`或`运行脚本时,使用`$ 0`不起作用.script`; 脚本的名称不可用.

2> Alex Reynold..:

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

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

示例输出:

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

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

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


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

3> Dimitre Rado..:

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"


嗨@vladr,上面的代码是POSIX!如果我理解正确,你的意思是代码不会运行旧的Bourne shell(例如Solaris <11上的/ bin/sh),但这与POSIX无关.
@vladr,Bourne shell不符合POSIX标准,它早于POSIX标准.POSIX.1的标准化用户命令行和脚本接口基于Korn Shell.据我所知,所有商业Unices都提供符合POSIX标准的shell(例如,它是Solaris上的/ usr/xpg4/bin/sh).
推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有