Предупреждение должно идти в stderr.
В дополнение к пунктам, представленным другими (вызывающим ошибки синтаксического анализа для последующих процессов и скрывающим ошибку от пользователя на консоли), существует проблема гибкости.
Если пользователь не хочет, чтобы предупреждение от stderr передавалось в последующий процесс, который анализирует stdout, ему не нужно делать ничего особенного.
your_script | downstream_process
Если пользователь хочет, чтобы предупреждение от stderr перешло в последующий процесс, который будет анализировать stdout и stderr, пользователь может использовать 2> & 1 для перенаправления stderr в stdout.
your_script 2>&1 | downstream_process
Если вы выводите как предупреждения, так и обычные данные на стандартный вывод, у пользователя нет хорошего способа отделить предупреждения от данных, не анализируя все.
Поэтому отправка предупреждений в stderr также повышает гибкость вашего сценария.