Отладочные сообщения о функции

Вы увидите это после коммита 2bfb50924c7e, «iwlwifi :использовать обработчик многопоточных прерываний» . Это изменение было выпущено в версии ядра 3.9 (2013 ).


(Ядра в вопросе не имеютCONFIG_IRQ_FORCED_THREADING_DEFAULT(илиPREEMPT_RT). И я не загружаю ядро ​​с помощью опции threadirqs.)

1
16.04.2021, 11:25
1 ответ

Ваш 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 .

1
28.04.2021, 22:52

Теги

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