【问题标题】:Find file's own path查找文件自己的路径
【发布时间】:2011-06-16 01:40:48
【问题描述】:

我试图找出 Windows/DOS 变量 %cd% 的 unix 等效项是什么。我正在寻找的是一个环境变量或一种解决方法,它可以让我将一个变量设置为当前运行的文件的路径。

例如,如果程序在 /home/chris/Desktop,但工作目录是 /home/chris,那么获取 ~/Desktop 的命令是什么,而不是 pwd,它会给我 /home/chris。

【问题讨论】:

  • 从哲学上讲,这很困难,因为文件没有唯一的路径(请参阅硬链接)。调用文件的路径是您所希​​望的最好的。

标签: bash shell unix environment-variables


【解决方案1】:

在 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 将为您提供文件名。不知何故,如果你能从$0 中过滤掉PWD,你可能会得到你想要的东西。我在以下方面有一些运气:

 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】:

    dirname $(readlink -f $0)怎么样

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

    dirname 删除所有内容,包括最后的\

    【讨论】:

      【解决方案3】:

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

      ${0%/*}
      

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

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

      【讨论】:

      • $0 是输入中的第一个单词,这意味着它实际上就是用户对程序的调用,对吧?
      • @jpm:差不多。这就是它不完全可靠的原因。
      【解决方案4】:

      按照 Chris 的建议,您可以使用 which 命令。根据man 页面,which 报告了如果在 shell 提示符下输入其参数将执行的可执行文件的完整路径。由于我们知道在 shell 提示符下输入了 $0,我们可以使用 `which $0` 来准确报告用于执行的路径。不幸的是,这仍然受到符号链接问题的影响,因为它没有提供避免符号链接的选项。

      【讨论】:

        猜你喜欢
        • 2012-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-14
        • 2014-03-13
        • 2013-03-30
        • 2017-06-02
        相关资源
        最近更新 更多