Вы увидите это после коммита 2bfb50924c7e, «iwlwifi :использовать обработчик многопоточных прерываний» . Это изменение было выпущено в версии ядра 3.9 (2013 ).
(Ядра в вопросе не имеютCONFIG_IRQ_FORCED_THREADING_DEFAULT
(илиPREEMPT_RT
). И я не загружаю ядро с помощью опции threadirqs
.)
Ваш echo "${FUNCNAME[1]}"
выводит на стандартный вывод, поэтому его вывод относится к выводу debug_function
, который, в свою очередь, принадлежит выводу test_function
.
Напечатать сообщение в stderr:
путем перенаправления выводаecho
:
echo "${FUNCNAME[1]}" >&2
или путем перенаправления всего вывода debug_function
(, если вся функция должна печатать только в stderr )при вызовеdebug_function
:
debug_function >&2
Последний метод позволяет командам внутри debug_function
напрямую выводить на стандартный вывод. То, что они печатают, будет перенаправлено, потому что стандартный вывод debug_function
перенаправляется.
Сама функция может перенаправить свой stdout на свой stderr с помощью exec >&2
. Это повлияет на все команды в функции. Но это также повлияет на вызывающую функцию/скрипт, если только функция перенаправления не запускается в подоболочке.
Вы можете запустить функцию в подоболочке по требованию с помощью (debug_function)
. Чтобы всегда запускать функцию в подоболочке, используйте ()
вместо {}
при определении функции.
Таким образом, функция, единственной целью которой является вывод в stderr, а не в stdout, может быть определена как:
debug_function()(
exec >&2
echo whatever
#...
)
Теперь echo
и другие команды в функции не нуждаются в >&2
. Даже если вы вызываете функцию просто как debug_function
, содержащиеся в ней команды будут выводиться в stderr.
Примечание :stdout или stderr одной подоболочки или команды могут отличаться от stdout или stderr другой подоболочки или команды или скрипта в целом. Перенаправления возможны на многих уровнях. Следовательно, даже функция, выполняющая exec >&2
в своей собственной подоболочке, может в конечном итоге записать в стандартный вывод всего скрипта, если «правильные» перенаправления происходят вне тела функции. Я не буду уточнять.
Самое главное помнить:
Stdout часто перехватывается (, как в вашем случае ), или передается дальше. Основная цель stderr — не позволять сообщениям об ошибках/отладке/диагностике загрязнять stdout .