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
У вас возникли проблемы с переносимостью экспортированной функции bash между системами. Да, это имеет смысл.
Для повышения портативности просто
$ touch myfunc
$ chmod a+x myfunc
и поместите нужный код bash в этот файл, начиная со строки #! /usr/bin/env bash
shebang.(env
подчиняется $PATH
, видите ли.)
Тогда вы полагаетесь на способность программ (включая gnu parallel )для fork+exec, а не от того, насколько хорошо такие варианты, как sh
или dash
, соответствуют поведению bash
.
Проблема заключается в том, что /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"'