Экспортированные функции bash иногда видны из Perl

xterm имеет эту функцию:

   +dc     This option enables the escape sequence to change dynamic
           colors.  The option sets the dynamicColors option to “true”.

Дополнительная информация: https://github.com/sos4nt/dynamic-colors

5
02.08.2016, 01:44
2 ответа

У вас возникли проблемы с переносимостью экспортированной функции bash между системами. Да, это имеет смысл.

Для повышения портативности просто

$ touch myfunc
$ chmod a+x myfunc

и поместите нужный код bash в этот файл, начиная со строки #! /usr/bin/env bashshebang.(envподчиняется $PATH, видите ли.)

Тогда вы полагаетесь на способность программ (включая gnu parallel )для fork+exec, а не от того, насколько хорошо такие варианты, как shили dash, соответствуют поведению bash.

0
27.01.2020, 20:43

Проблема заключается в том, что /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"'
1
27.01.2020, 20:43

Теги

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