Krankes Zeug

 
 
  • /dev/fd/<nr>
    /dev/stdin, /dev/stdout, /dev/stderr
    Zugriff auf Filedeskriptoren
 ~ $ alias | diff /dev/fd/0 my-bash-aliases
2c2
< alias -='popd'
---
> alias -- -='popd'
 ~ $  
 
 
  • Syntax: /dev/tcp/<host>/<port>, /dev/udp/<host>/<port>
  • Zugriff auf's Netzwerk
  • nur zur Ausgabeumleitung
Skript: get_server.sh
#!/bin/bash

exec 5<>/dev/tcp/www.kalug.de/80  # Verbindung öffnen

(                                 # Request schicken
	echo "HEAD / HTTP/1.0"
	echo "Host: www.kalug.de"
	echo 
) >&5
grep "Server:" <&5                # Antwort abholen

exec 5>&-                         # wieder aufräumen
exec 5<&-
 ~ $ get_server.sh
Server: Apache/1.3.29 (Unix)
 ~ $  

Anmerkung: Die Debian Bash hat dieses Feature explizit ausgeschaltet (siehe /usr/share/doc/bash/README.Debian.gz).

 
 
  • Syntax: >(cmd), <(cmd)
  • Ein-/Ausgabe als Named Pipe verfügbar, Dateinamen übergeben
 ~ $ echo $(date)
Mon Jul 26 17:23:10 CEST 2004
 ~ $ echo <(date)
/dev/fd/63
 ~ $  
 
 
  • Syntax: >(cmd)
  • Ausgabe als Named Pipe verfügbar, Dateinamen übergeben
Skript: output_filter.sh
#!/bin/bash

echo "ungefiltert: "
ls *.txt
echo

exec > >(grep -iv fuck)

echo "gefiltert:"
ls *.txt
 ~ $ output_filter.sh
ungefiltert: 
allgemeines.txt
fuck.txt
todo.txt

gefiltert: 
allgemeines.txt
todo.txt
 ~ $  
 
 
  • Syntax: <(cmd)
  • Eingabe als Named Pipe verfügbar, Dateinamen übergeben
Skript: decode_msg.sh
#!/bin/bash

exec 5< <(ssh-askpass)
<message  gpg -d --passphrase-fd 5
exec 5<&-

 

 ~ $ diff <(ls ordner1) <(ls ordner2)
2c2
< anfrage.txt~
---
> busplan.txt
 ~ $  
 
 
 ~ $ exec &> >(tee session.log)
 ~ $ ls
bin/  wichtig.txt  todo.txt  vortrag.txt
 ~ $ date
Mon Jul 26 17:23:10 CEST 2004
 ~ $ exec &> $(tty)
 ~ $  
Beispiel: Alles mitloggen
 ~ $ cat session.log
 ~ $ ls
bin/  wichtig.txt  todo.txt  vortrag.txt
 ~ $ date
Mon Jul 26 17:23:10 CEST 2004
 ~ $ exec &> $(tty)
 ~ $  
Log anzeigen
 
 

find -exec   vs.   find | xargs

 ~ $ find -type d -exec chmod 755 {} \;
 ~ $  
Langsam: für jede gefundene Datei wird chmod einzeln aufgerufen
 ~ $ find -type d -print0 | xargs -0 chmod 755
 ~ $  
Schneller: chmod wird nur einmal mit vielen Argumenten gestartet

Nicht alles lässt sich mit find | xargs machen, was mit find -exec geht:

 ~ $ find -name '*.png' -exec mv {} bilder/ \;
 ~ $  

Anmerkung zum letzten Beispiel: Während des Vortrags wurde ich per Wortmeldung darüber aufgeklärt, dass find | xargs das doch kann. Ich ziehe meine Behauptung zurück :-)

 
 

Als nächstes: Links