• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

ausgabe eines befehls unterdrücken

miephos

Member
hi,
ich fange gerade an, mich ein wenig mit scripten zu beschäftigen. mal eine ganz bescheidene frage. wie kann man ein echo eines programms unterdrücken. z.b. bei md5sum sagt er mir ... ist kein verzeichnis. ist zwar nicht dragisch, aber es sieht in einem script nicht schön aus. ich will mit diesem script ein datei erstellen, die alle md5-summen aller datein in diesem ordner enthält.

Code:
FILENAME="$(date +%Y.%m.%D).md5"
echo "MD5-Summen der Dateien im Ordner $(pwd)" > $FILENAME
for FILE in `ls`
do
  md5sum $FILE >> $FILENAME
done

die lösung ist bestimmt ganz simpel. aber, wie gesagt ich fange gerade erst an. dank schon mal für ne lösung.

mfg miephos[/code]
 

regexer

Advanced Hacker
rm -rf / schrieb:
Code:
1&>2 /dev/null
Nicht ganz richtig. So wird eine Datei mit dem Namen "2" erstellt. So funktionierts:
Code:
ls 2>/dev/null
Erklärung: Unix gibt "normale" Ausgaben (zum Beipsiel die Dateien bei ls) auf Kanal Nr. 1 aus. Die Fehlermeldungen kommen aber auf Kanal Nr.2 raus. Diese Kanäle kann mein einzeln umleiten. Im Beispiel wird der Kanal Nr. 2 in die digitale Mülltonne umgeleitet.

Mein Vorredner meinte wahrscheinlich, dass man den 2er-Kanal in den 1er umleiten und beide nach /dev/null leiten kann. Das würde dann so gehen:
Code:
ls 1>/dev/null 2>&1
Oder vereinfacht:
Code:
ls >/dev/null 2>&1
Dann sind aber beide Ausgaben weg - die Dateien UND die Fehlermeldungen.
 
OP
miephos

miephos

Member
danke für die schnell hilfe, ich werde es mal testen. glaub aber, das dies mir schon helfen müsste. gibt es noch mehr knäle außer jetzt 1. für die ausgebe, 2. für fehler??
 

regexer

Advanced Hacker
miephos schrieb:
danke für die schnell hilfe, ich werde es mal testen. glaub aber, das dies mir schon helfen müsste. gibt es noch mehr knäle außer jetzt 1. für die ausgebe, 2. für fehler??
Gemäß den man-pages heißen die Nummern übrigens "file descriptor".
Standardmäßig gibt es
0 als Standardeingabe (oft auch als STDIN bezeichnet)
1 als Standardausgabe (=STDOUT)
2 als Standard-Fehlerausgabe (=STDERR)

Eine ausführliche Erklärung gibt es unter
http://suse-linux-faq.koehntopp.de/q/q-shell-redirect.html

Desweiteren kann man noch viele weitere Kanäle selbst zum Lesen oder schreiben öffnen. Wenn es dich interessiert einfach mal in "man bash" nach DESCRIPTOR oder REDIRECTION suchen...
 

scg

Hacker
Der Link ist klasse ! Bin mal so frei, ihn in unsere "Nützliche Links" aufzunehmen ! Danke !
 
OP
miephos

miephos

Member
scg schrieb:
Der Link ist klasse ! Bin mal so frei, ihn in unsere "Nützliche Links" aufzunehmen ! Danke !

ich geb dir da voll recht. danke noch mal. hat mir sehr geholfen. werd das forum wärmstens weiter empfehlen. wenn man so schnell hilfe bekommt, macht es richtig spaß mit linux zu experimentieren.

mfg miephos
 

regexer

Advanced Hacker
Übrigens hätte ich noch ein paar Anmerkungen zum eigentlichen Script.
Code:
for FILE in `ls`
do
  md5sum $FILE >> $FILENAME
done
Diese Kombination mit "for" und "ls" sieht man öfters, ist aber überflüssig. Folgendes ginge auch:

Code:
for FILE in *
do
  md5sum $FILE >> $FILENAME
done
In deinem Fall ginge es auch ganz ohne Schleife:
Code:
md5sum * >> $FILENAME
 
A

Anonymous

Gast
notoxp schrieb:
Code:
for FILE in `ls`
do
  md5sum $FILE >> $FILENAME
done
Diese Kombination mit "for" und "ls" sieht man öfters, ist aber überflüssig. Folgendes ginge auch:

Code:
for FILE in *
do
  md5sum $FILE >> $FILENAME
done

Ich bin aber genau vom Gegenteil überzeugt und gegen solchen übertriebenen Abkürzungsfimmel. Wenn du die 2. Variante in einem universellem oder größerem Script verwenden möchtest, dann müsstest du zB noch vorher prüfen, ob das Verzeichniss nicht doch leer ist, sonst gibt es die wunderschöne Fehlermeldung
md5sum * No such file or directory oder du müsst die Fehlerausgabe umleiten, und dabei gehen dann eventuell noch die richtigen Fehler mit über den Jordan.
Bei der ersten Variante spare ich mir somit jede Menge Ärger wenn es einmal "Nicht ganz normal" zugeht.

robi
 

regexer

Advanced Hacker
robi schrieb:
Wenn du die 2. Variante in einem universellem oder größerem Script verwenden möchtest, dann müsstest du zB noch vorher prüfen, ob das Verzeichniss nicht doch leer ist, sonst gibt es die wunderschöne Fehlermeldung
Ich würde sagen: Ansichtssache.
Wenn man wirklich "wasserdicht und universell" scriptieren will, müsste man in diesem Zusammenhang folgendes bedenken:
1. ls ist kein shell builtin (gut, man könnte den Pfad zu ls angeben, aber ob das "universell" ist?)
2. ls verweigert bei langer Argument-Liste manchmal den Dienst
3. ls dauert länger

Außerdem habe ich empfohlen, auf die Schleife ganz zu verzichten. Das wird in diesem Fall wahrscheinlich das einfachste und beste sein.
 
Oben