sh中的%~dp0等价

时间:2008-10-16 09:46:59

标签: linux shell batch-file

我正在使用sh将一些Windows批处理文件转换为Unix脚本。我有问题,因为某些行为取决于批处理文件中可用的%~dp0宏。

有没有相当于这个?有没有办法获得执行脚本所在的目录?

8 个答案:

答案 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 -

其工作原理如下:

  1. cd到脚本目录,使用命令行的相对路径或绝对路径。
  2. 获取此目录的绝对路径,并将其存储在SCRIPTDIR
  3. 使用“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%/*}