【问题标题】:Perl: Get (unresolved) path of symbolic linkPerl:获取(未解析)符号链接的路径
【发布时间】:2023-03-17 06:02:01
【问题描述】:

我有一个 perl 脚本,它的路径是 /scripts/original/ascript.pl

此脚本的符号链接也存在:/scripts/linked/ascript.pl

在 ascript.pl 中,我需要调用脚本的路径(因此是 /scripts/original 或 /scripts/linked)。

abs_path() 总是返回解析的位置:

use strict;
use Cwd qw(abs_path);

print abs_path($0); # Always prints /scripts/original/ascript.pl

如何获得完整的未解析路径?

【问题讨论】:

  • “我需要调用脚本的路径” 您不需要这样做。解释为什么你认为这是必要的。
  • 这是一个动态生成HTML页面的脚本。它可以从不同的位置(不同的 URL,但甚至从本地命令提示符)调用。根据调用的位置,脚本需要对生成的页面进行细微的更改。
  • 然后像往常一样向脚本传递一个参数。

标签: perl


【解决方案1】:

您可以使用Cwd::getcwd() 获取未解析的脚本路径。但是这已经在FindBin 中以更健壮和通用的方式实现了,所以我们不必重新发明轮子:

use FindBin;
print '$Bin: ', $FindBin::Bin, "\n";
print '$Script: ', $FindBin::Script, "\n";

输出

$Bin: /scripts/linked
$Script: ascript.pl

你查看FindBinhere的来源。

【讨论】:

  • @Zippy1970 奇怪。你在什么系统上?你如何运行脚本?如果从 shell 运行脚本,那么运行脚本时 shell 的当前目录是什么?
  • 它在旧的 Debian 系统上运行。我正在从外壳测试脚本。当我这样做时,当前目录是 /scripts/linked 并且它仍然返回 /scripts/original
  • 好的,我仍然认为它应该可以工作。所以为了在解决这个问题上取得进展,我认为你应该调试FindBin模块的源代码。尝试从here下载FindBin的源码。然后将该文件放入例如一个临时目录,例如/tmp/mylib/FindBin.pm。然后在脚本的顶部使用use lib '/tmp/mylib'/tmp/mylib 添加到您的Perl 搜索路径中。现在您可以通过将调试打印语句添加到 /tmp/mylib/FindBin.pm 和 ... 来开始调试模块
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多