Решения 'eval и' source 'работают, если у вас нет функции в функции, которую можно было бы оценить во время создания, которую вы фактически хотите отложить до времени выполнения.
source /dev/stdin << EOF
badfunc ()
{
echo $(date)
}
EOF
$ date;badfunc;sleep 10;date;badfunc
Tue Dec 1 12:34:26 EST 2015 ## badfunc output not current
Tue Dec 1 12:23:51 EST 2015
Tue Dec 1 12:34:36 EST 2015 ## and not changing
Tue Dec 1 12:23:51 EST 2015
Да, это надуманный пример (просто позвоните по дате и не повторяйте вызов подоболочки), но, используя оригинальные ответы, я попробовал что-то более сложное, которое требовало оценки во время выполнения и получило аналогичные результаты - оценка в время компиляции, а не время выполнения.
Способ, которым я решил проблему, заключался в том, чтобы создать временный файл с функцией и затем получить его. Благодаря разумному использованию одинарных и двойных кавычек, окружающих тест, который я печатаю в файл, я могу полностью контролировать, что и когда оценивается.
tmpsh=$(mktemp)
echo "goodfunc ()" > $tmpsh
echo '{' >> $tmpsh
echo 'echo $(date)' >> $tmpsh
echo '}' >> $tmpsh
. $tmpsh
rm -f $tmpsh
, а затем
$ date;goodfunc;sleep 10;date;goodfunc
Tue Dec 1 12:36:42 EST 2015 ## current
Tue Dec 1 12:36:42 EST 2015
Tue Dec 1 12:36:52 EST 2015 ## and advancing
Tue Dec 1 12:36:52 EST 2015
Надеюсь, это будет более полезным для людей. Наслаждайтесь.