GNU Make экспортирует макрос как переменную среды, только если он уже присутствует

Проблема заключается в том, что /bin/shиз таких систем, как Debian или Ubuntu(dash)или OpenBSD, удалит из среды все переменные, имена которых содержат замысловатые символы, такие как %, включая такие BASH_FUNC_foo%%=() {..., которые используются для кодирования экспортируемых функций bash.

Если за |-из функции openследует один аргумент вместо списка аргументов, и этот аргумент содержит какие-либо метасимволы оболочки (обратная косая черта является одним из этих ), тогда perl передать его в качестве аргумента /bin/sh -cвместо прямого использования execvp(2).

То же самое относится к функциям system, exec, open2и т. д. в Perl и задокументировано в perldoc -f system.

Более простой пример:

$ foo(){ echo foo; }; export -f foo

$ perl -e 'system shift' '/bin/bash -c foo\ a'
/bin/bash: foo: command not found
$ perl -e 'system shift' '/bin/bash -c foo'
foo
$ perl -e 'system shift' '/bin/bash -c "foo"'
/bin/bash: foo: command not found

$ perl -e 'open F, "|-", shift' '/bin/bash -c foo\ a'
/bin/bash: foo: command not found
$ perl -e 'open F, "|-", shift' '/bin/bash -c foo'
foo

Работа -состоит в том, чтобы запускать внешние команды с $ENV{SHELL}пользователя, что позволит ему беспрепятственно использовать любые функции оболочки:

perl -e 'open F, "|-", $ENV{SHELL}, "-c", "@ARGV"' '/bin/bash -c "foo a"'

0
22.04.2021, 16:04
0 ответов

Теги

Похожие вопросы