查找文件自己的路径

时间:2011-06-16 01:40:48

标签: bash shell unix environment-variables

我正在尝试找到与Windows / DOS变量%cd%相当的unix。我正在寻找的是环境变量或变通方法,它允许我将变量设置为当前运行的文件的路径。

例如,如果程序在/ home / chris / Desktop中,但工作目录是/ home / chris,那么得到〜/ Desktop的命令是什么,而pwd将给我/ home / chris。

4 个答案:

答案 0 :(得分:2)

dirname $(readlink -f $0)

怎么样?

readlink -f $0返回正在运行的脚本的规范化路径。

dirname删除了最终\之后的所有内容。

答案 1 :(得分:2)

在BASH中,您可以查看$PWD变量。这将显示您的目前的工作目录。获得$ PWD与程序所在位置之间的关系有点棘手。您可以查看$ 0变量,该变量应该为您提供运行以下脚本的文件的名称:

#! /bin/bash
#

echo "PWD = $PWD"
echo "\$0 = $0"

得到以下结果:

$ test.sh         
PWD = /Users/david
$0 = /Users/david/bin/test.sh

$0为您提供操作系统根目录中文件的名称。取dirname将为您提供文件名。不知何故,如果您可以从PWD过滤出$0,那么您可能会得到您想要的内容。我对以下内容感到满意:

 curPath=$(dirname "${0#$PWD/}")

没有彻底测试它,从我所看到的,它似乎做你想要的。不能做的是做这样的事情:

$ test.sh
PWD = /Users/david/someSubDir
$0 = /Users/david/bin/test.sh
The current path is /Users/david/bin/test.sh

如果可以做到这一点会很好:

The current path is ../bin/test.sh

虽然前者是正确的。

readlink命令在非Linux系统上不起作用。

答案 2 :(得分:0)

这种方式有效,但不是100%可靠:

${0%/*}

有效的方式是它读取$0(程序名称),并从最后的斜杠开始剥离所有内容。它不可靠,因为如果通过符号链接调用脚本,您将获得包含符号链接的目录,而不是包含真实脚本的目录。

此外,可以为$0传递“假”值,例如使用exec -a。因此,即使您没有使用符号链接,它仍然不是100%的解决方案。事实上,这种解决方案并不存在。

答案 3 :(得分:0)

使用Chris建议的内容,您可以使用which命令。根据{{​​3}}页面,which报告在shell提示符下输入参数时可执行的可执行文件的完整路径。因为我们知道在shell提示符下输入了$ 0,所以我们可以使用`which $ 0`来准确报告用于执行的路径。不幸的是,这仍然存在符号链接问题,因为它没有提供避免符号链接的选项。