我正在尝试找到与Windows / DOS变量%cd%相当的unix。我正在寻找的是环境变量或变通方法,它允许我将变量设置为当前运行的文件的路径。
例如,如果程序在/ home / chris / Desktop中,但工作目录是/ home / chris,那么得到〜/ Desktop的命令是什么,而pwd将给我/ home / chris。
答案 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`来准确报告用于执行的路径。不幸的是,这仍然存在符号链接问题,因为它没有提供避免符号链接的选项。