Вы находитесь в 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
Лучше всего должен был бы использовать что-то еще для Вашего имени функции все же.
Похоже, что программа переписывает различные функции 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.
Похоже, что программа повторно написать различные функции записи () для обнаружения, независимо от того, являетесь ли вы печати в файловом дескрипте 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")'
Согласно инструкции из https://github.com/sickill/stderred Вы должны добавить в свой скрипт
export LD_PRELOAD="/path/to/stderred/\$LIB/libstderred.so${LD_PRELOAD:+:$LD_PRELOAD}"
, где $ lib
Может быть замена вручную на вас архитектуру
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).