2015-07-02 3 views
8

Я очень новичок в Perl и недавно столкнулся со следующей проблемой. Мой код Perl должен находиться в одном файле (он вызывается другой программой, в которой я не контролирую). Теперь я хочу, чтобы сценарий работал с флагом (например, perl myscript.pl -T для режима taint), хотя он изначально вызывается без флага. Как я могу это сделать, т. Е. Как мне установить флаг из файла Perl?Создание скрипта Perl * запуск самого себя * с флагами

Одна из идей, которые у меня возникли, состоит в том, чтобы снова запустить файл (после вызова без флагов), на этот раз с флагом -T (выдав команду оболочки, такую ​​как system($^X, "myscript.pl -T", @ARGS);). Будет ли это работать? Любые лучшие идеи?

+3

если вы контролируете myscript .pl' вы можете установить режим taint, изменив строку shebang, чтобы включить '-T', например '#!/usr/bin/env perl -T' –

+0

Какая команда используется для вызова скрипта в другой программе? Если это что-то вроде '/ path/to/myscript.pl', вы можете просто добавить' -T' в строку shebang. – ThisSuitIsBlackNot

+4

a -T в строке shebang необязательно включает режим taint - если скрипт вызывается с 'perl' из оболочки без' -T', вы получаете фатальную ошибку – mob

ответ

5

Я думаю, что вы на правильном пути. Вы можете использовать переменную $^{TAINT} и exec вместо system:

exec($^X, $0, '-T', @ARGV) if $^{TAINT} < 1; 

Это не будет работать во всех случаях. С одной стороны, вы потеряете некоторые другие параметры командной строки, что ваш сценарий может изначально быть вызван с:

perl -I/path/to/some/more/libs -w -MNecessary::Module myscript.pl ... 

Есть некоторые обходные пути, чтобы некоторые из них (use warnings или добавить -w переключатель к вашему exec выше высказыванию, анализировать @INC и %INC, чтобы определить, какие -I и -M переключатели были добавлены), но чем больше вы узнаете о том, как именно вызывается ваш сценарий, тем больше вы можете выяснить, какие обходные пути вам нужно беспокоиться.


В зависимости от ... групповой динамики в игре здесь другой подход заключается в осуществлении некоторого косвенного контроля над вызывающей программой. Идем дальше и ставим -T на линию shebang, поскольку @Hunter McMillen и @ThisSuitIsBlackNot предлагают, ждать отчета об ошибке, а затем диагностировать проблему как «программа, не вызываемая с помощью ключа -T» ...

+0

К сожалению, это не работает для меня, скорее всего, из-за проблем, о которых вы упомянули. Ввод -T на линии shebang вызывает ошибку: _ "- T" находится на #! line, он также должен использоваться в командной строке_ – mike622867

Смежные вопросы