【问题标题】:How to use shell script code in a Perl script如何在 Perl 脚本中使用 shell 脚本代码
【发布时间】:2019-08-01 12:57:43
【问题描述】:

我想在 Perl 中转换一个 shell 脚本代码并使用 exec 来执行代码。我有用 perl 编写的程序,但在一个条件下,我必须添加一个代码,我知道我们可以在 shell 脚本中如何做,但不确定我们如何在 perl 中做。

Shell 脚本代码:

(
echo "MIME-Version: 1.0"
echo "Subject: "
echo "Content-Type: text/html"
cat <emailbody>
) | mailx -r "test@gmail.com" 

我的 Perl 代码:

!/usr/bin/perl

use strict;
use warnings;

my $mailx = "/usr/bin/mailx";

if($ARGV[0] eq "ty" && $ARG[1]){
 /// Here we want to use the shell script code .
}

my @args_to_pass = ($mailx, @ARGV);
exec @args_to_pass;

【问题讨论】:

  • 您可以使用许多用于发送电子邮件的 Perl 模块。在 metacpan 上搜索一个看起来不错的。
  • @Shawn 我知道。但我有一些限制,我必须使用这个
  • 存在各种版本的mailx,它们在如何指定标头方面存在很大差异。即使sendmail 更好(更一致)——你能用它来代替吗?
  • @Developer :如果您想在 shell 中处理所有内容,请将其编写为 shell 脚本,然后从您的 Perl 应用程序中调用您的脚本。这也使调试更容易。
  • "sendmail 也是一个不错的选择" --- 例如,this post 怎么样?我很容易找到的东西。关于 SO 的内容还有很多。

标签: shell perl


【解决方案1】:

您的 shell 代码的字面意思是:

if($ARGV[0] eq "ty" && $ARG[1]){
    my $pid = open(STDIN, '-|') // die "Can't fork(): $!";
    if ($pid == 0) {
        print "MIME-Version: 1.0\n";
        print "Subject: \n";
        print "Content-Type: text/html\n";

        exec 'cat', ... or die "Can't exec() cat: $!";
        # or print more text, but don't forget to exit() afterwards if you don't exec
    }
}

这个想法是创建一个管道和一个子进程。如上所示使用open,管道的写入端连接到子级的STDOUT,读取端连接到父级的STDIN

然后子进程将数据写入管道并退出。它可以自己完成所有工作,并在最后将exitexec 转换为cat

子进程产生的所有输出都在父进程的STDIN 上可用,父进程由mailx 继承。

【讨论】:

    猜你喜欢
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 2014-06-05
    • 2011-11-26
    相关资源
    最近更新 更多