我正在使用sh将一些Windows批处理文件转换为Unix脚本。我有问题,因为某些行为取决于批处理文件中可用的%~dp0宏。
有没有相当于这个?有没有办法获得执行脚本所在的目录?
答案 0 :(得分:7)
$0
的问题(对你来说)是设置为用于调用脚本的命令行,而不是脚本本身的位置。这可能使得很难获得包含脚本的目录的完整路径,这是您从Windows批处理文件中%~dp0
获得的。
例如,请考虑以下脚本dollar.sh
:
#!/bin/bash
echo $0
如果您运行它,您将获得以下输出:
# ./dollar.sh
./dollar.sh
# /tmp/dollar.sh
/tmp/dollar.sh
因此,要获取脚本的完全限定目录名,请执行以下操作:
cd `dirname $0`
SCRIPTDIR=`pwd`
cd -
其工作原理如下:
cd
到脚本目录,使用命令行的相对路径或绝对路径。SCRIPTDIR
。cd -
”返回上一个工作目录。答案 1 :(得分:3)
在Linux下的bash中,您可以使用以下命令获取命令的完整路径:
readlink /proc/$$/fd/255
并获取目录:
dir=$(dirname $(readlink /proc/$$/fd/255))
这很难看,但我还没有找到另一种方式。
答案 2 :(得分:2)
是的,你可以!这是在争论中。 :)
看看
${0}
将其与
相结合{$var%Pattern}
Remove from $var the shortest part of $Pattern that matches the back end of $var.
你想要的只是
${0%/*}
我推荐Advanced Bash Scripting Guide (这也是上述信息来自的地方)。 特别是Converting DOS Batch Files to Shell Scripts上的部分 可能对你有用。 :)
如果我误解了你,你可能必须将它与“pwd”的输出结合起来。因为它只包含调用脚本的路径! 请尝试以下脚本:
#!/bin/bash
called_path=${0%/*}
stripped=${called_path#[^/]*}
real_path=`pwd`$stripped
echo "called path: $called_path"
echo "stripped: $stripped"
echo "pwd: `pwd`"
echo "real path: $real_path
这需要一些工作。 我建议使用Dave Webb的方法,除非这是不可能的。
答案 3 :(得分:2)
我试图找到源自另一个脚本的脚本的路径。这就是我的问题,当源文本被复制到调用脚本中时,所以$ 0总是返回有关调用脚本的信息。
我找到了一种解决方法,只能在bash中使用,$ BASH_SOURCE始终包含有关其所引用脚本的信息。即使脚本来源,也可以正确解析为原始(源)脚本。
答案 4 :(得分:1)
正确的答案是这个: How do I determine the location of my script? I want to read some config files from the same place.
重要的是要意识到,在一般情况下,这个问题没有解决方案。您可能听说过的任何方法以及下面将详述的任何方法都存在缺陷,并且仅适用于特定情况。首先,尽量不要依赖脚本的位置来避免问题!
在我们深入研究解决方案之前,让我们澄清一些误解。重要的是要了解: 您的脚本实际上没有位置!无论字节最终来自何处,都没有"一条规范路径"对于它。从不。 0美元不是您问题的答案。如果您认为是,您可以停止阅读并编写更多错误,或者您可以接受并继续阅读。 ...
答案 5 :(得分:0)
我之前尝试过$ 0,即:
dirname $ 0
它只返回“。”即使脚本是由另一个脚本提供的:
。 ../ somedir / somescript.sh
答案 6 :(得分:0)
这适用于bash shell:
dir=$(dirname $(readlink -m $BASH_SOURCE))
测试脚本:
#!/bin/bash
echo $(dirname $(readlink -m $BASH_SOURCE))
运行测试:
$ ./somedir/test.sh
/tmp/somedir
$ source ./somedir/test.sh
/tmp/somedir
$ bash ./somedir/test.sh
/tmp/somedir
$ . ./somedir/test.sh
/tmp/somedir
答案 7 :(得分:-1)
试试这个:
${0%/*}