Frage zu Bash, Syntax ist mir nicht klar

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
fourhead
Beiträge: 8
Registriert: 14.05.2005 23:31:03
Wohnort: Köln

Frage zu Bash, Syntax ist mir nicht klar

Beitrag von fourhead » 29.03.2006 15:32:36

Hallo,
ich bin z.Zt. dabei mich in Bash-Scripting fit zu machen und komme sehr gut voran, allerdings ist mir eine Kleinigkeit nicht klar. Ich musste in einem Script überprüfen, ob ein Benutzer bereits exisitiert und bin dabei auf folgende Codezeile gestoßen:

if id $1 > /dev/null 2>&1; then

soweit ist ja alles klar, if..then, id kenn ich auch, nur was genau bedeutet das

> /dev/null 2>&1

das > /dev/null alleine ist mir auch klar, aber das 2>&1 entzieht sich jeglicher Logik (zumindest meiner ;-) ). Also wie gesagt, was diese Codezeile macht ist mir völlig klar, nur dieses 2>&1 hinten kenne ich nicht. Kann mir jemand weiterhelfen?

Dabei erinnere ich mich grade ein (vermutlich themenverwandtes Problem). Ich lösche in besagtem Script einen Benutzer mit userdel $1. Das erzeugt etwas Output auf dem Bildschirm, den ich unterdrücken will, also userdel $1 > /dev/null. Trotzdem sehe ich immer noch die Meldung "no crontab for user" oder so ähnlich - ich kann diese Meldung im Script mit dieser Methode nicht unterdrücken. Wie geht das??


Tom

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Re: Frage zu Bash, Syntax ist mir nicht klar

Beitrag von roli » 29.03.2006 15:59:28

Hi,

ich wuerde um zu checken ob ein Benutzer existier, die /etc/passwd parsen, nebenbei bemerkt.
fourhead hat geschrieben:das > /dev/null alleine ist mir auch klar, aber das 2>&1 entzieht sich jeglicher Logik (zumindest meiner ;-) ). Also wie gesagt, was diese Codezeile macht ist mir völlig klar, nur dieses 2>&1 hinten kenne ich nicht. Kann mir jemand weiterhelfen?

Dabei erinnere ich mich grade ein (vermutlich themenverwandtes Problem). Ich lösche in besagtem Script einen Benutzer mit userdel $1. Das erzeugt etwas Output auf dem Bildschirm, den ich unterdrücken will, also userdel $1 > /dev/null. Trotzdem sehe ich immer noch die Meldung "no crontab for user" oder so ähnlich - ich kann diese Meldung im Script mit dieser Methode nicht unterdrücken. Wie geht das??
Das "2>&1" heisst "haenge den Output der auf STDERR ("Kanal 2") kommt mit an STDOUT ("Kanal 1") an. Da bei dir STDOUT nach /dev/null umgeleitet wird, ist damit saemtlicher Output weg. Um STDOUT umzuleiten reicht es ">/dev/null" zu schreiben, du koenntest aber auch "1>/dev/null" schreiben, oder auch jedes andere Ziel natuerlich.
Die Meldung "no crontab for user" wird wohl auf STDERR geschrieben, was sich fuer eine Fehlermeldung/Warnung ja auch anbietet, da du hier STDERR aber nicht weiter behandelst wird es halt auf dem Bildschim ausgegeben. Der Bildschirm (das Terminal) ist das default "Medium" fuer STDOUT und STDERR.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Benutzeravatar
fourhead
Beiträge: 8
Registriert: 14.05.2005 23:31:03
Wohnort: Köln

Beitrag von fourhead » 29.03.2006 16:03:41

Hallo,
vielen dank schonmal. Also um mal zusammenzufassen:

>/dev/null oder 1>/dev/null

schreibt NUR STDOUT nach /dev/null

2>/dev/null

schreibt NUR STDERR nach /dev/null. Kann ich das auch kombinieren, also z.b.

>/dev/null 2>/var/log/error.log ?? So das also die normale Ausgabe verschwindet, eventuell auftretende Fehler aber in eine Logdatei geschrieben werden?


Tom

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 29.03.2006 16:34:12

Code: Alles auswählen

>/dev/null 2>/var/log/error.log
fourhead hat geschrieben:So das also die normale Ausgabe verschwindet, eventuell auftretende Fehler aber in eine Logdatei geschrieben werden?
ja stimmt

Bitte verwende für code code tags - der Lesbarkeit wegen
hier noch zwei gute Links
http://www.tldp.org/LDP/abs/html/io-redirection.html
http://www.linuxfibel.de/bash.htm#EAUmleitung

markus

Antworten