如何真正看到链接到一个文件的不同 perl 脚本的内容?

Posted

技术标签:

【中文标题】如何真正看到链接到一个文件的不同 perl 脚本的内容?【英文标题】:How to really see the contents of the different perl scripts linking to one file? 【发布时间】:2021-11-01 12:56:42 【问题描述】:

我想在我们的环境中查看名为dfv_run.pl 的 perl 脚本的内容,并专门检查第 245 行。该脚本的第 245 行在我的模拟日志文件中打印了消息“完成检查测试结果”。执行% which dfv_run.pl后我指向这个位置:

drwxr-xr-x 2 dfvmgr dfvadmin 4.0K Jun 22  2017 .SYNC
-r--r--r-- 1 dfvmgr dfvadmin 3.2K Jun 22  2017 loadenv.csh
-r-xr-xr-x 1 dfvmgr dfvadmin 5.2K Jun 22  2017 loadenv
drwxr-xr-x 4 dfvmgr dfvadmin 4.0K Jun 22  2017 ..
drwxr-xr-x 3 dfvmgr dfvadmin 4.0K Jun 22  2017 .
lrwxrwxrwx 1 dfvmgr dfvadmin    7 Jun 22  2017 dfv_comp.pl -> loadenv
lrwxrwxrwx 1 dfvmgr dfvadmin    7 Jun 22  2017 dfv_run.pl -> loadenv
lrwxrwxrwx 1 dfvmgr dfvadmin    7 Jun 22  2017 dfv_sim.pl -> loadenv
/tools/dfv/scripts/v11/bin

但是脚本只有不到 200 行,我可以看到 dfv_comp.pldfv_run.pldfv_sim.pl 的相同内容(diff 也没有显示 3 个 perl 脚本之间的任何差异)。 loadenv 当然也给我看了同样的内容。

非常感谢任何关于如何查看每个 perl 脚本的真实内容的帮助。可能有帮助的其他信息:

SHELL=/bin/tcsh
KONSOLE_DBUS_SERVICE=:1.46
KONSOLE_DBUS_WINDOW=/Windows/17
KONSOLE_DBUS_SESSION=/Sessions/30

如果需要更多信息,请告诉我。提前谢谢!

【问题讨论】:

您将需要显示完整的实际输出,可能还需要显示 loadenv 的来源。 loadenv 调用其他脚本的可能性非常高,其中一个脚本的第 245 行正在打印。 根据您的回答,我正在慢慢进步。一开始loadenv 里面全是环境变量设置所以没太注意。在代码的最后,有一个系统调用my $cmd = qq(tcsh -fc "source $bin_path/loadenv.csh @my_args"); 将我引向loadenv.csh。该脚本还有一堆变量设置,在代码底部附近还有一个包含多个位置的$PATH 变量。在检查了一条对我的目的有意义的路径(即验证)后,我终于看到了实际使用的脚本。非常感谢! 作为补充学习,为什么脚本以这种方式构造的背后有什么原因? 通常是为了代码重用和抽象。今天大多数人使用 Bash(或 Mac 上的 zsh),但我和你一样是 tcsh 用户。 loadenv 可能需要检测您的 shell,以便它可以调用正确的脚本,例如 loadenv.csh,这可能需要在您的 shell 上下文中设置其他内容,而不是脚本的 shell/进程。多级加载和源代码相同但名称不同的情况有点常见,尤其是在 Linux/Unix 应用程序中。 【参考方案1】:

您所看到的真正的内容。所有三个*.pl 文件名都是loadenv 脚本的别名——一个脚本处理所有四个命令。

如果您查看loadenv(或其他三个名称中的任何一个)的内容,您很可能会看到它会检查使用哪个名称来调用它,然后设置一些标志,这将导致它根据使用的名称,行为会有所不同。

【讨论】:

以上是关于如何真正看到链接到一个文件的不同 perl 脚本的内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Perl 中只写文件的某些行?

在perl中将文件添加到压缩文件夹

如何将信息从 web 传递到 perl 脚本?

生信perl脚本中常见的几个模块

使sym链接到可执行文件

如何从命令行测试Perl CGI脚本的文件上传?