2010-04-15 9 views
8

druckt Ich möchte wissen, ob es einen integrierten BASH-Befehl gibt, der einige Text auf Stderr wie der echo Befehl druckt, der Text auf stdout druckt. Ich möchte keine temporäre io-Umleitung verwenden. Ich benutze einen eingebauten Befehl, um einen Fehler auf stderr wie (ls: unerkannte Option '--asdf') zu generieren, aber ich möchte etwas sauberer.Bash-Befehl, der eine Nachricht auf stderr

bearbeiten ----

Eigentlich versuche ich stderr/stdout Umleitung zu demonstrieren, und mein Beispiel wie folgt aussieht:

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

Aus Gründen der Klarheit ich die test.sh Datei behalten möchten, wie so einfach und sauber wie möglich, dies vermeidet > Operator in der Datei.

Antwort

11

echo something >&2 ist die richtige Art zu tun, was Sie wollen.

jedoch ...

Dies wird ein kleines Programm, das seine Argumente stderr wird Echo:

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 

Sie es wie folgt verwenden können:

$ ./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 
+0

Sie können hinzufügen: 'if (argc> 1) fprintf (stderr," \ n ");' um eine streunende Newline zu 'stderr' zu verhindern, wenn keine Eingabe erfolgt. –

+0

@DavidC.Rankin: Ich denke, das ist eine gute Idee. Wie es aussieht, gibt es jedoch eine neue Zeile aus, wenn keine Argumente vorhanden sind, genauso wie "echo". –

+0

Ja, das habe ich auch gesehen, aber ich dachte mir, wenn wir etwas Brauchbares machen würden, könnten wir es einen Wurf besser machen lassen :) Ich testete beide Wege, und ich mag es, den Zeilenumbruch bei keiner Eingabe zu unterdrücken. Andere mögen die Leerzeile. –

2

Kein builtin, könnten Sie verwenden:

function echo-err { echo "[email protected]" >&2; } 
0

Generell denke ich, dass es nicht wirklich ein Unterschied zwischen ‚temporäre io-Umleitung‘ ist und das, was Sie wollen. stderr ist ein Dateideskriptor wie jeder andere, und jedes Built-in, das tut, was Sie wollen, würde innerlich dasselbe tun, indem Sie das Echo wie Jürgen weiterleiten, nämlich indem Sie write() darauf aufrufen.

1

Sie könnten auch einen Alias ​​erstellen.

+0

Dies funktioniert nicht für 'echoerr foo 2> test-err.txt', da der Alias ​​erweitert wird, dann werden beide Umleitungen gleichzeitig eingerichtet und der zweite weiß nicht, dass der erste eingerichtet wurde noch. Aliase sollten in Skripten vermieden werden - stattdessen Funktionen verwenden. –

1

Nur eine Bemerkung am Rande : Wenn Sie bash demonstrieren möchten, sollten Sie bash, nicht sh:

verwenden

Auch wenn sh ein Link auf Ihrem System einzuschlagen ist, wird es überprüfen, wie es genannt wurde (arg0) und sh-Anrufe wie ein Aufruf

bash --posix 

die manchmal führt behandeln zu unterschiedlichen Verhalten subtil. Ein häufiger Fehler, wie Shebang #/bin/sh, aber es hat in der Shell funktioniert (was/bin/bash war).

1

Niemand hat diese erwähnt, aber man kann dies auch tun:

echo An error message > /dev/stderr

Es ist vielleicht besser lesbar als >&2 aber ich denke, das hängt davon ab, wer Sie sind.