3

Perlでは、'exec'、'system'、および'qx'に/bin / sh以外のシェルを使用させることは可能ですか('exec "$ SHELL -c ..."'のような構造を使用せずに、 perlの再コンパイル)?

編集:この質問の動機は、'export -f foo'を実行し、サブシェルでperlを使用して'システム"foo"'を介して関数を直接呼び出すbashスクリプトです。この手法がすべてのshで機能するかどうかはわかりません。そのシナリオでは、「system "/ bin / bash -c foo"」が機能する可能性がありますが、エクスポートされた関数が/bin/のすべてのバリアントに伝播することは期待できません。 sh。しかし、ほとんどの場合、私はただ興味があり、ソリューションをqxに拡張する方法に興味があります。また、UNIX以外のプラットフォームについては何も知らないので、ソリューション内の代替シェルへのパスをハードコーディングすることは避けたいと思います。

4

4 に答える 4

6

execとを上書きできますsystem。詳細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 $$';
于 2009-08-09T17:12:59.020 に答える
3

exec引数を1つだけ渡す場合は、シェル(UNIX以外のシステムではsystem使用されない可能性があります)を使用します。/bin/sh(詳細はで説明されていperlfuncます)

IPC::Run3の代わりに見てみたいと思うかもしれませんsystem

于 2009-08-09T16:09:33.373 に答える
3

'exec "$ SHELL -c ..."'を使用してみませんか?execまたはsystemを呼び出すたびにそのコードを表示したくない場合は、サブルーチンで非表示にします。それが彼らの目的です。:)

sub my_exec {
    exec $ ENV {SHELL}、'-c'、@ _;
    }

ただし、それを実行したい場合は、$ ENV {SHELL}をサニタイズして、人々が奇妙な値を設定してスクリプトに奇妙なことをしないようにすることをお勧めします。シェルが/etc/ shellsにリストされていること、またはシステムが承認されたログインシェルをリストしていることを確認することをお勧めします。また、この汚染をクリーンにするためにもう少し作業を行う必要があります。これは、データを別のプロセスに送信する場合におそらく行う必要があります。

于 2009-08-10T09:35:34.060 に答える
-5

execは/bin/shを使用しません

指定したプログラムを実行するだけです。シェルはありません。

シェルを通過させたい場合は、自分で行う必要があります。

于 2009-08-09T15:53:15.153 に答える