16

echo, который выводит в stderr

16

Существует ли стандартная команда Bash, которая ведет себя как echo, но выводит информацию в поток ошибок (stderr) вместо стандартного вывода (stdout)?

Я знаю, что можно использовать echo foo 1>&2, но это выглядит не очень красиво и, по моему мнению, может привести к ошибкам (например, существует большая вероятность, что этот код будет неправильно отредактирован, если что-то изменится).

5 ответ(ов)

5

Вы можете определить функцию следующим образом:

echoerr() { echo "$@" 1>&2; }
echoerr hello world

Это будет быстрее, чем скрипт, и не потребует дополнительных зависимостей.

Специфичное для bash предложение Камило Мартина использует "here string" и будет выводить всё, что вы передаете ему, включая аргументы (-n), которые echo обычно игнорирует:

echoerr() { cat <<< "$@" 1>&2; }

Решение Гленна Джека также избегает проблемы с игнорированием аргументов:

echoerr() { printf "%s\n" "$*" >&2; }

Таким образом, все три варианта функциоально эквивалентны и могут быть использованы для вывода сообщений об ошибках.

4

Поскольку 1 — это стандартный вывод, нет необходимости явно указывать его перед перенаправлением вывода, например, с использованием >. Вы можете просто ввести:

echo Это сообщение отправляется в stderr >&2

Поскольку вы, пох看来, беспокоитесь о том, что 1>&2 будет трудно набирать, исключение лишнего 1 может немного ободрить вас!

0

Если вас не смущает возможность записи сообщений также в syslog, довольно простым способом будет использование следующей команды:

logger -s $msg

Опция -s означает: "Выводить сообщение как в стандартный поток ошибок, так и в системный журнал."

0

Другой вариант:

echo foo >> /dev/stderr

Этот код позволяет отправить вывод команды echo foo непосредственно в стандартный поток ошибок (stderr). Вместо того чтобы выводить текст на стандартный вывод (stdout), он перенаправляет его в stderr, что может быть полезно для логирования ошибок или предупреждений.

0

Нет, это стандартный способ сделать это. Он не должен вызывать ошибок.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь