Команда Bash, которая печатает сообщение на stderr - PullRequest
9 голосов
/ 15 апреля 2010

Я хочу знать, есть ли встроенная команда BASH, которая печатает некоторый текст на stderr, точно так же, как команда echo, которая печатает текст на stdout. Я не хочу использовать временное перенаправление. Я использую встроенную команду для генерации ошибки на stderr, такую ​​как ls --asdf (ls: нераспознанная опция '--asdf'), но я хочу что-то более аккуратное.

Редактировать ----

На самом деле я пытаюсь продемонстрировать перенаправление stderr / stdout, и мой пример выглядит так:

sh test.sh >test-out.txt 2>test-err.txt

Для ясности я хочу, чтобы файл test.sh был как можно более простым и чистым, это означает, что в нем не следует использовать оператор >.

Ответы [ 6 ]

11 голосов
/ 15 апреля 2010

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
3 голосов
/ 15 апреля 2010

Нет встроенного, вы можете использовать:

function echo-err { echo "$@" >&2; }
2 голосов
/ 19 августа 2014

Никто не упомянул об этом, но вы также можете сделать это:

echo An error message > /dev/stderr

Возможно, это более читабельно, чем >&2, но я думаю, это зависит от того, кто вы.

2 голосов
/ 15 апреля 2010

Вы также можете сделать псевдоним.

alias echoerr='echo >&2'
1 голос
/ 16 апреля 2010

Просто sidenote: если вам нравится демонстрировать bash, вы должны использовать bash, а не 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).

0 голосов
/ 15 апреля 2010

В общем, я думаю, что на самом деле нет разницы между «временным перенаправлением» и тем, что вы хотите.stderr - это файловый дескриптор, как и любой другой, и любая встроенная программа, которая делает то, что вам нужно, просто делала бы то же самое внутри себя, что и вы, перенаправляя echo, как предложил Юрген выше, а именно вызывая write () для него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...