是否有可能让’exec’在Perl中使用’$SHELL -c’而不是’/ bin / sh -c’?

前端之家收集整理的这篇文章主要介绍了是否有可能让’exec’在Perl中使用’$SHELL -c’而不是’/ bin / sh -c’?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在Perl中,是否有可能使’exec’,’system’和’qx’使用除/ bin / sh之外的 shell(不使用像’exec’这样的构造$SHELL -c …“’,并且没有重新编译perl)?

编辑:这个问题的动机是一个bash脚本,它执行’export -f foo’,然后在子shell中使用perl直接通过’system“foo”’调用函数.我不确定这种技术是否适用于所有sh,虽然’system’/ bin / bash -c foo“’可能在这种情况下有效,但我不希望导出的函数在/ bin /的所有变体中传播SH.但大多数时候我只是好奇,现在对如何将解决方案扩展到qx感到好奇.此外,由于我对非unix平台一无所知,所以我想避免在解决方案中对备用shell的路径进行硬编码.

解决方法

您可以覆盖exec和系统.有关详细信息,请参阅 perldoc perlsub,但这里大致是您想要的(模拟一些引用错误,我不想尝试修复):

#!/usr/bin/perl

use strict;
use warnings;

use subs qw/system/;

sub system {
    #handle one arg version:
    if (@_ == 1) {
        return CORE::system "$ENV{SHELL} -c $_[0]";
    }
    #handle the multi argument version
    return CORE::system @_;
}

print "normal system:\n";
system "perl","-e",q{system q/ps -ef | grep $$/};

print "overloaded system:\n";
system 'ps -ef | grep $$';

猜你在找的Perl相关文章