Можно ли заставить 'exec' использовать '$ SHELL -c' вместо '/ bin / sh -c' в Perl? - PullRequest
3 голосов
/ 09 августа 2009

В Perl можно ли заставить 'exec', 'system' и 'qx' использовать оболочку, отличную от / bin / sh (без использования такой конструкции, как 'exec "$ SHELL -c ..."' , а без перекомпиляции perl)?

РЕДАКТИРОВАТЬ: мотивацией для этого вопроса является сценарий bash, который выполняет 'export -f foo', а затем использует perl в подоболочке для непосредственного вызова функции через 'system' foo ''. Я не уверен, что этот метод будет работать со всеми sh, и хотя 'system "/ bin / bash -c foo"' может работать в этом сценарии, я не ожидаю, что экспортируемая функция будет распространяться на все варианты / bin / шиллинг Но в основном мне было просто любопытно, а теперь мне интересно, как расширить решение до qx. Кроме того, поскольку я ничего не знаю о не-Unix платформах, я бы хотел избежать жесткого кодирования пути к альтернативной оболочке в решении.

Ответы [ 4 ]

6 голосов
/ 09 августа 2009

Вы можете переопределить 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 $$';
3 голосов
/ 10 августа 2009

Почему вы не хотите использовать 'exec "$ SHELL -c ..."'? Если вы не хотите видеть этот код каждый раз, когда вы вызываете exec или system, просто спрячьте его в подпрограмме. Вот для чего они здесь. :)

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

Однако, если вы хотите сделать это, я предлагаю как-то санировать $ ENV {SHELL}, чтобы люди не делали странных вещей с вашим сценарием, устанавливая странные значения. Возможно, вы захотите убедиться, что оболочка указана в / etc / shells или каким-либо другим способом, который ваша система выводит на экран одобренные оболочки входа. Вам также нужно проделать немного больше работы, чтобы сделать эту работу более чистой, что вам, вероятно, следует сделать, если вы собираетесь отправлять данные в другой процесс.

3 голосов
/ 09 августа 2009

exec и system будут использовать оболочку (которая, вероятно, не будет /bin/sh в не-UNIX системах), если вы передадите ей только один аргумент. (Подробности описаны в perlfunc)

Возможно, вы захотите взглянуть на IPC::Run3 в качестве альтернативы system

0 голосов
/ 09 августа 2009

exec не использует / bin / sh

Это просто исполняемая вами программа. Нет снарядов.

Если вы хотите, чтобы он прошел через оболочку, вы должны сделать это самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...