Команда Bash, которая печатает сообщение на stderr

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

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

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

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

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

10
задан Salman A 15 April 2010 в 07:05
поделиться

5 ответов

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
11
ответ дан 3 December 2019 в 20:03
поделиться

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

alias echoerr='echo >&2'
2
ответ дан 3 December 2019 в 20:03
поделиться

Небольшое примечание: если вы хотите продемонстрировать 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).

1
ответ дан 3 December 2019 в 20:03
поделиться

Нет встроенной функции, вы можете использовать:

function echo-err { echo "$@" >&2; }
3
ответ дан 3 December 2019 в 20:03
поделиться

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

0
ответ дан 3 December 2019 в 20:03
поделиться