echo, который выводит в stderr
Существует ли стандартная команда Bash, которая ведет себя как echo
, но выводит информацию в поток ошибок (stderr) вместо стандартного вывода (stdout)?
Я знаю, что можно использовать echo foo 1>&2
, но это выглядит не очень красиво и, по моему мнению, может привести к ошибкам (например, существует большая вероятность, что этот код будет неправильно отредактирован, если что-то изменится).
5 ответ(ов)
Вы можете определить функцию следующим образом:
echoerr() { echo "$@" 1>&2; }
echoerr hello world
Это будет быстрее, чем скрипт, и не потребует дополнительных зависимостей.
Специфичное для bash предложение Камило Мартина использует "here string" и будет выводить всё, что вы передаете ему, включая аргументы (-n), которые echo
обычно игнорирует:
echoerr() { cat <<< "$@" 1>&2; }
Решение Гленна Джека также избегает проблемы с игнорированием аргументов:
echoerr() { printf "%s\n" "$*" >&2; }
Таким образом, все три варианта функциоально эквивалентны и могут быть использованы для вывода сообщений об ошибках.
Поскольку 1
— это стандартный вывод, нет необходимости явно указывать его перед перенаправлением вывода, например, с использованием >
. Вы можете просто ввести:
echo Это сообщение отправляется в stderr >&2
Поскольку вы, пох看来, беспокоитесь о том, что 1>&2
будет трудно набирать, исключение лишнего 1
может немного ободрить вас!
Если вас не смущает возможность записи сообщений также в syslog, довольно простым способом будет использование следующей команды:
logger -s $msg
Опция -s
означает: "Выводить сообщение как в стандартный поток ошибок, так и в системный журнал."
Другой вариант:
echo foo >> /dev/stderr
Этот код позволяет отправить вывод команды echo foo
непосредственно в стандартный поток ошибок (stderr). Вместо того чтобы выводить текст на стандартный вывод (stdout), он перенаправляет его в stderr, что может быть полезно для логирования ошибок или предупреждений.
Нет, это стандартный способ сделать это. Он не должен вызывать ошибок.
Извлечение имени файла и расширения в Bash
Как изменить цвет вывода echo в Linux
Как сделать паузу в shell-скрипте на одну секунду перед продолжением?
Как работает "cat << EOF" в bash?
Передача параметров в функцию Bash