Существует ли стандартный инструмент Bash, который действует как эхо, но выводит на stderr, а не на stdout?
Я знаю, что могу сделать, echo foo 1>&2
но это довольно уродливо и, я подозреваю, подвержено ошибкам (например, более вероятно, что редактирование будет неправильным, когда все изменится)
Ответы:
Вы можете сделать это, что облегчает чтение:
>&2
копирует дескриптор файла № 2 в дескриптор файла № 1. Следовательно, после выполнения этого перенаправления оба дескриптора файла будут ссылаться на один и тот же файл: один дескриптор файла № 2 изначально ссылался на него. Для получения дополнительной информации см. Учебник по перенаправлению Bash Hackers .источник
alias
скрипт в оболочке. Вероятно, было бы безопаснее использоватьerrcho(){ >&2 echo $@; }
errcho(){ >&2 echo $@|pr -To5;}
, не будет работать. Чтобы сделать что-то подобное, вы должны будете поместить редирект где-то после последней трубы, как:errcho(){ echo $@|>&2 pr -To5;}
Вы можете определить функцию:
Это будет быстрее, чем скрипт и не будет иметь никаких зависимостей.
В предложении Камило Мартина, касающемся bash, используется «строка здесь», и она напечатает все, что вы ей передадите, включая аргументы (-n), которые echo обычно глотает:
Решение Гленна Джекмана также позволяет избежать проблемы глотания аргументов:
источник
echoerr -ne xt
не собирается печатать "-ne xt". Лучше использоватьprintf
для этого.echoerr() { cat <<< "$@" 1>&2; }
printf "%s\n" "$*" >&2
$IFS
заключаете в кавычки, все, разделенные одним или несколькими пробелами, отправляются в качестве отдельного аргумента, что в случаеecho
означает их конкатенацию с0x20
s, но опасность не заключать в кавычки намного больше, чем удобство ввода на 2 символа меньше) ,Поскольку
1
это стандартный вывод, вам не нужно явно называть его перед перенаправлением вывода, например>
вместо, но вместо этого можно просто набрать:Поскольку вы, похоже, беспокоитесь о том, что вам
1>&2
будет сложно набрать достоверно, устранение лишнего1
может быть для вас небольшим стимулом!источник
Другой вариант
источник
foo
- имеет свой собственный перенаправленный stderr - например,foo >foo.log 2>&1
- тогдаecho foo >/dev/stderr
закроет весь вывод перед ним.>>
следует использовать вместо:echo foo >>/dev/stderr
/dev/fd/2
./proc/self/fd/2
. Смотрите мой ответ ниже :)Нет, это стандартный способ сделать это. Это не должно вызывать ошибок.
источник
1>&2
. Мы все хотели бы, чтобы этого не случилось, но я уверен, что мы все были местами, где это происходит.( echo something 1>&2 ; something else ) > log
->(echo something; cp some junk 1>&2 ; something else) > log
Ой.Если вы не против записать сообщение также в syslog, используйте not_so_ugly:
Параметр -s означает: «Вывести сообщение в стандартную ошибку, а также в системный журнал».
источник
Это простая функция STDERR, которая перенаправляет вход канала в STDERR.
источник
echo what | /dev/stderr
Примечание: я отвечаю на пост, а не на вводящий в заблуждение / расплывчатый вопрос «эхо, которое выводит на stderr» (уже отвеченный OP).
Используйте функцию, чтобы показать намерение и источник реализации, которую вы хотите. Например
И
error_handling
существо:Причины, которые решают проблемы в OP:
Другие причины:
источник
Мое предложение:
или
echo "my errz" > /proc/self/fd/2
будет эффективно выводитсяstderr
потому , что/proc/self
это ссылка на текущий процесс, и/proc/self/fd
держит процесс открыт дескрипторов файлов, а затем0
,1
и2
стоятьstdin
,stdout
иstderr
соответственно./proc/self
Ссылка не работает на MacOS, однако,/proc/self/fd/*
доступно на Termux на Android, но не/dev/stderr
. Как определить ОС из скрипта Bash? может помочь, если вам нужно сделать ваш скрипт более переносимым, определив, какой вариант использовать.источник
/proc/self
Ссылка не работает на MacOS, так что я буду придерживаться более прямолинейный/dev/stderr
метод. Кроме того, как отмечено в других ответах / комментариях, вероятно, лучше использовать,>>
чтобы добавить./proc/self/fd/*
доступно на Termux на Android, но не доступно/dev/stderr
.Не используйте, так
cat
как некоторые из них упоминаются здесь.cat
это программа whileecho
иprintf
встроенная в bash (shell). Запуск программы или другого скрипта (также упомянутого выше) означает создание нового процесса со всеми его расходами. Используя встроенные функции, написание функций довольно дешево, потому что нет необходимости создавать (выполнять) процесс (-окружение).Опнер спрашивает "есть ли какой-нибудь стандартный инструмент для вывода ( конвейера ) в stderr", краткий ответ: НЕТ ... почему? ... перераспределение каналов - это элементарная концепция в таких системах, как unix (Linux ...), и bash (sh) опирается на эти концепции.
Я согласен с новичком, что перенаправление с нотациями, как это:
&2>1
это не очень приятно для современных программистов, но это bash. Bash не был предназначен для написания огромных и надежных программ, он предназначен для того, чтобы помочь администраторам работать там с меньшим количеством нажатий клавиш ;-)И, по крайней мере, вы можете разместить перенаправление в любом месте строки:
источник
cat
и инструктажем, чтобы кто-то не использовал cat, потому что он медленный. Существует бесчисленное множество случаев, когда cat является правильным выбором, поэтому я возражаю против вашего ответа.echo
замену. Даже если он используетcat
, он должен использовать перенаправление bash. тем не мение. Таким образом, здесь нет абсолютно никакого смысла использоватьcat
. Кстати, я используюcat
100 раз в день, но никогда в контексте, который просил новичок ... вы поняли?Другой вариант, на который я недавно наткнулся, это:
При этом используются только встроенные средства Bash, в то время как вывод многострочных ошибок менее подвержен ошибкам (так как вам не нужно добавлять
&>2
каждую строку).источник
cat
или какую-либо другую утилиту, которая не относится к теме вопроса.read
это встроенная команда оболочки, которая печатает в stderr и может использоваться как echo без выполнения трюков перенаправления:-t 0.1
Является тайм - аут , который отключает Рида основную функциональность, хранения одной строки стандартного ввода в переменную.источник
Сделать сценарий
это было бы вашим инструментом.
Или сделайте функцию, если вы не хотите иметь скрипт в отдельном файле.
источник
Объединение решения, предложенного Джеймсом Ротом и Гленном Джекманом
источник
Mac OS X: я попробовал принятый ответ и несколько других ответов, и все они привели к написанию STDOUT, а не STDERR на моем Mac.
Вот переносимый способ записи в стандартную ошибку с использованием Perl:
источник