【问题标题】:Sourcing other Scripts in perl script在 perl 脚本中采购其他脚本
【发布时间】:2014-02-10 01:39:44
【问题描述】:

因为我的项目,我今天开始学习 Perl 脚本。

让我先给你定义一下我的项目,这样你就可以清楚地知道我想要做什么。

我正在为应用程序的测试运行编写脚本。当我的脚本将执行时,它将从用户那里获取 3 个参数,然后它将为应用程序获取 *.ini 文件。在获取该文件后,该脚本将从不同的位置执行另一个 perl 脚本,而第二个 perl 脚本将在(比如说)folder1 中为我提供两个文本文件。并且文件将是 test.date1.txt 和 test.date11.txt 然后我的脚本将从不同位置为同一应用程序调用另一个 perl 脚本,这第三个 perl 脚本也会给我两个不同的文本文件(test.date2.txt和 test.date22.txt)在不同的文件夹中。现在我想重命名第一个和第二个文件夹中的文件第一次运行结果第二次运行结果resoectively,我想比较有什么区别。

到目前为止,我已经分配了我的输入参数,如果用户不提供参数,那么将向用户显示什么错误,并且我已经阅读了在线教程上的比较,并做了一些这样的比较代码:

use Text::Diff;

my $diffs = diff 'test.date1.csv' => 'test.date2.csv';

print $diffs;

我不知道如何获取我的 *.ini 文件,然后运行我的其他 perl 脚本? 谁能帮我这个。这对我有很大的帮助。

注意:我今天开始编写脚本,如果我在定义项目时犯了一个愚蠢的错误,非常抱歉

【问题讨论】:

  • 所以你想编写你的ini文件并使用绝对路径作为另一个脚本的参数?
  • 我已经有 ini 文件和其他两个 perl 脚本,我在 shell 终端中使用“Source my.ini”来获取 ini 文件,现在我不知道如何运行 source my. perl 中的 ini 命令。
  • 等等……你是说source my.ini?所以你的'ini文件'不是ini file而是一个shell脚本?这令人困惑!
  • shell 脚本有什么作用?在 Perl 中重写它可能比获取脚本然后使用结果更容易(这只能以非常复杂的方式完成:从 Perl,exec 一个首先运行脚本的 shell,然后是 execs Perl与你的 Perl 脚本的其余部分)。

标签: perl


【解决方案1】:

采购 .ini 文件是什么意思? .ini 文件是配置文件。你需要一个ini解析器。这是一个帮助解决此问题的 SO 链接:How can I access INI files from Perl?

我个人使用 Tiny,发现它既简单又适合我的需求。

【讨论】:

  • 我在 shell 终端中使用“Source my.ini”来设置环境变量,这个 ini 文件包含 shell 脚本和我的应用程序的一些其他数据。
  • 您可以使用 system("source my.ini")。不过,使用系统调用有几个注意事项。它可能适用于您的问题。
  • @ Eugene K:谢谢,我在我的工作电脑上试过,但这个命令在那里不起作用,但我在我的笔记本电脑上用 my.ini 中的“echo hello”试过了。如果我只是写“source my.ini”,那么它会显示“hello”,但是如果我在 perl 脚本中编写这个系统(“source my.ini”),那么它只会执行它,但不会在终端中显示输出。在我的工作电脑上,它给了我一个错误,即 ini 不是 exec。
  • 您好,谁能解释一下 perl 中的 RAC 是什么?我从 intnenet 获得了一些关于采购 shell 脚本的参考,例如:make_path( "$self->{project_rerun_path}/$self->{cfgname}.$self->{id}" ); open RAC, ">$self->{project_rerun_path}/$self->{cfgname}.$self->{id}/run_and_check.csh"; print RAC '#!/bin/csh -f' . "\n"; print RAC "setenv CT_LIB_PATH $self->{my_path}\n"; print RAC "cd $self->{my_path}\n"; print RAC "source my.ini\n"; }
【解决方案2】:

好吧..我想我明白了..

你的意思是 bash shell 内置命令

source

在当前shell中执行作为参数传递的文件的内容

。文件名 [参数] 源文件名 [参数]

要为当前正在运行的 bash 重新加载 bash 设置,您可以这样做

source ~/.bashrc

. ~/.bashrc

Link

which source

man bash

从当前 shell 中的文件名读取并执行命令 环境并返回最后执行的命令的退出状态 从文件名。如果文件名不包含斜杠,则文件名在 PATH 用于查找包含文件名的目录。文件 在 PATH 中搜索不需要是可执行的。当 bash 不在 posix 中时 模式下,如果在 PATH 中没有找到文件,则搜索当前目录。 如果 shopt 内置命令的 sourcepath 选项被关闭, 不搜索 PATH。如果提供了任何参数,它们将变为 执行文件名时的位置参数。否则 位置参数不变。返回状态是状态 脚本中退出的最后一个命令的次数(如果没有命令,则为 0 已执行),如果文件名未找到或无法读取,则返回 false。

也许很高兴知道: Is there a difference between “.” and “source” in bash, after all?


好吧,回答您的问题..您正在寻找以下之一:

  1. system()你想执行一个命令却不想 捕获它的输出

  2. exec你不想返回调用 perl 脚本

  3. backticks你想捕获命令的输出

  4. open 你想通过管道传输命令(作为输入或输出) 到你的脚本


  1. 示例系统()

    system("command arg1 arg2 arg3");
    

    system("command", "arg1", "arg2", "arg3");
    
  2. 示例执行

    exec("ls -l");
    

    记住 exec() 执行指定的命令并且永远不会返回到调用程序,除非在失败的情况下,因为指定的命令不存在并且 exec 参数是一个数组。

  3. 反引号示例

    $result = `command arg1 arg2`;
    

    甚至

    @result = `command arg2 arg2`;
    

    ..command 被执行,命令的输出返回给调用脚本

    试试

    $result = `command 2>&1`;
    

    获得 sterr 和标准输出

  4. 示例 open()

    open(PS,"ps -e -o pid,stime,args |") || die "Failed: $!\n";
    while ( <PS> ) {
        ...
    }
    

    open() 捕获命令的数据

    open("command |"))
    

    此外,您可以将脚本生成的数据提供给外部命令

    open("| command")
    

    只是管道播放;)

【讨论】:

  • 感谢您的帮助,我也从互联网上得到了一些帮助,我可以通过system (". /my.ini"); 在 perl 中运行命令,但由于我没有 usr/bin 的权限,所以它不起作用,我必须通过命令行通过 source my.ini 运行它,我还找到了另外 1 个解决方案,那就是我可以制作包装脚本,并且在 perl 中我可以调用该包装脚本,对不起,我不知道包装脚本所以可能是我定义错了