Запишите в stderr

Вы находитесь в zsh, нет bash.

В zsh, repeat (вдохновленный csh repeat) конструкция, привыкшая к repeat команды.

repeat 10 echo foo

Повторил бы нечто 10 раз.

Если Вы хотите назвать Ваш repeat, необходимо было бы заключить его в кавычки так, чтобы это не было взято в качестве repeat зарезервированное слово.

$ echo $ZSH_VERSION
5.0.2
$ 'repeat'() echo "$*"
$ type -a repeat
repeat is a reserved word
repeat is a shell function
$ repeat 2 echo foo
foo
foo
$ "repeat" 2 x
2 x

Лучше всего должен был бы использовать что-то еще для Вашего имени функции все же.

6
25.10.2014, 20:28
4 ответа

Похоже, что программа переписывает различные функции write(), чтобы определить, распечатываете ли вы дескриптор 2 в файл, а затем добавляет соответствующие экранирующие коды, чтобы сделать вывод красным на терминале.

К сожалению, в shell'е, когда вы делаете что-то вроде

echo "foo" 1>&2 

Функция все равно будет вызывать write (или какой-то другой аналогичный системный вызов) на файловый дескриптор 1. Выводится на fd 2, так как дескриптор 1 был преобразован в дескриптор 2 вашей оболочкой.

К сожалению, я не знаю способа записи /directly/ в fd 2 в оболочке, но вы можете использовать awk. Такая функция запишет аргументы непосредственно в дескриптор 2.

error() {
  awk " BEGIN { print \"$@\" > \"/dev/fd/2\" }"
}

Я считаю, что это особенность GNU awk, которая не является частью POSIX, но она также работает на awk, предоставляемом в OS X.

6
27.01.2020, 20:25

Похоже, что программа повторно написать различные функции записи () для обнаружения, независимо от того, являетесь ли вы печати в файловом дескрипте 2, а затем добавляете соответствующие коды Escape, чтобы сделать вывод красного на терминале.

К сожалению, в оболочке, когда вы делаете что-то вроде

echo "foo" 1>&2 

, функция все равно будет вызывать запись (или какого-то другого аналогичного системного вызова) на дескрипторе файла 1. Вывод появляется на FD 2, поскольку дескриптор 1 файла был откровлен Файловый дескриптор 2 по вашей оболочке.

К сожалению, я не знаю способа написать / напрямую / до FD 2 в Shell, но вы можете использовать awk. Таким образом, функция написает аргументы непосредственно к файловому дескриптору 2.

error() {
  awk " BEGIN { print \"$@\" > \"/dev/fd/2\" }"
}

Я считаю, что это особенность GNU awk, которая не является частью POSIX, но она также работает на AWK, предусмотренном на ОС X.

-121--61472-

, что программное обеспечение крючки система записи () вызовов, которые одобряют запись на файловом дескрипторе 2, это известно как STDERR .

Это общая библиотека (поэтому перекомпиляция ядра не нужна). Как описано в руководстве по установке, он использует варианту среды ld_preload . Динамический линкер может зависеть от модификации его поведения во время выполнения программы. Эти переменные регулируют процесс включения времени выполнения, поисшив общие библиотеки в альтернативных местах.

Исполняемый / BIN / BASH Сам не соблюдает такие переменные, поэтому сам использует исходную палитру системных вызовов, а не модифицированных. Перенаправление, которое вы упомянули в вашем вопросе, поступают в Bash . Не в исполняемости эхо . Если ECHO может с самим дескриптором ошибки (не через Bash) вывод будет красным.

Python может написать на STDERR . Смотрите доказательство (которое должно появиться в красном):

python -c 'import os; os.write(2, "error")'
4
27.01.2020, 20:25

Согласно инструкции из https://github.com/sickill/stderred Вы должны добавить в свой скрипт

export LD_PRELOAD="/path/to/stderred/\$LIB/libstderred.so${LD_PRELOAD:+:$LD_PRELOAD}"

, где $ lib Может быть замена вручную на вас архитектуру

-1
27.01.2020, 20:25

Crear una función auxiliar:

echoerr() { printf "\033[0;31m%s\n\033[0m" "$*" >&2; }

Y úsalo en cualquier lugar:

echoerr "something went wrong here"

Esto combina la escritura en stderr(>&2)y el cambio de colores (solución tomada de aquíhttps://stackoverflow.com/questions/5947742/how-to-change-the-output-color-of-echo-in-linux).

0
27.01.2020, 20:25

Теги

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