Я хочу знать, существует ли встроенная команда BASH, которая печатает некоторый текст на stderr, точно так же, как echo
управляйте что текст печати на stdout. Я не хочу использовать временное io-перенаправление. Я использую встроенную команду для генерации ошибки на stderr такой как ls --asdf
(ls: нераспознанная опция '-asdf'), но я хочу что-то более опрятное.
Редактирование----
На самом деле я пытаюсь продемонстрировать stderr/stdout перенаправление, и мой пример похож:
sh test.sh >test-out.txt 2>test-err.txt
Для ясности я хочу сохранить test.sh файл максимально простым и чистым, это означает избегать >
оператор в файле.
echo something> & 2
- это правильный способ делать то, что вы хотите.
Однако ...
Это создаст небольшую программу, которая будет выводить свои аргументы на stderr
:
gcc -o echoerr -x c - <<'EOF'
#include <stdio.h>
#include <stdlib.h>
void main(int argc, char **argv) {
int i;
for (i = 1; i < argc; i++) {
fprintf(stderr, "%s ", argv[i]);
}
fprintf(stderr, "\n");
exit(0);
}
EOF
Вы можете использовать это так:
$ ./echoerr this is an error message
this is an error message
$ ./echoerr this is an error message 2>error.out
$ cat error.out
this is an error message
Вы также можете создать псевдоним.
alias echoerr='echo >&2'
Небольшое примечание: если вы хотите продемонстрировать bash, вы должны использовать bash, not sh:
sh test.sh >test-out.txt 2>test-err.txt
bash test.sh >test-out.txt 2>test-err.txt
Даже если sh является ссылкой на bash в вашей системе, он проверит, как он был вызван (arg0), и обработает sh-вызовы как вызов
bash --posix
, что иногда приводит к незаметному и иному поведению. Распространенная ошибка, такая как shebangs # / bin / sh ', но она работала в оболочке' (которая была / bin / bash).
Нет встроенной функции, вы можете использовать:
function echo-err { echo "$@" >&2; }
В общем, я думаю, что нет никакой разницы между «временным перенаправлением io» и тем, что вы хотите. stderr - это файловый дескриптор, как и любой другой, и любая встроенная функция, которая делает то, что вы хотите, будет просто делать то же самое внутренне, что и вы, перенаправляя эхо, как предложил Юрген выше, а именно, вызывая для него write ().