Функция foo экспортируется в .bashrc
foo()
{
echo "run '$@'"
$@
}
export -f foo
Работает
foo cmake --build .
run 'cmake --build .'
[ 10%] Built target main
...
Не работает
foo cmake -G "Unix Makefiles" -DARCHITECTURE_TYPE=armv7_32
run 'cmake -G Unix Makefiles -DARCHITECTURE_TYPE=armv7_32'
CMake Error: Could not create named generator Unix
...
@chepner: спасибо за подсказку. Возможно, я еще не понимаю концепцию неинтерактивных оболочек. Значит ли это, что это невозможно?
@chepner: причина для меня в том, чтобы обойти программу (ib_console), которая не установлена на некоторых машинах. Он отлично работает, за исключением тех вызовов, где используются отметки об исключении.
Неинтерактивная оболочка - это обычно просто оболочка, выполняющая сценарий. Вы бы не хотели, чтобы сценарий работал иначе, чем предполагалось, потому что вы случайно переопределили функцию, на которую полагался сценарий. Определениеfoo в .bashrc в порядке; export -f foo просто не нужен.
@chepner: при удалении оператора экспорта из .bashrc я получаю сообщение об ошибке «команда не найдена» ??





Есть никогда причина использовать $@ без кавычек; В остальном он идентичен $*.
foo () {
# including $@ in a longer quoted string can cause some
# weird side effects; I just use $* instead.
echo "run '$*'"
"$@"
}
Практически нет причин экспортировать функцию. Любая интерактивная оболочка уже сама является источником
.bashrc, и есть веские причины, по которым нет предоставляет такие функции в неинтерактивных оболочках.