Weil wir es gerade von /proc und /sys hatten... (2)

Was könnte man zum Thema “/proc” und “/sys” noch so erzählen… ah, ich weiß! Kennt ihr so Dreckstools, die sich einfach weigern, von STDIN zu lesen? Egal, ob man sie mit einem - als letztem Parameter oder ganz ohne Eingabefile aufruft, sie können es einfach nicht? Tja, dank /proc entlockt uns sowas nur ein müdes Lächeln:

command | dreckstool /proc/self/fd/0

Und das ganze geht natürlich nicht nur mit FD 0 aka STDIN, sondern auch mit anderen FDs. Warum auch immer man das tun wollen würde.

Und eigentlich könnten wir noch was scripten, irgendwas in pseudo-bunt. Kennt ihr z.B. dialog? Nein? Solltet ihr aber! Stellt Euch mal vor, ihr habt nen großen Copy-Job angestoßen und wollt nicht immer watch ls -lh... benutzen, weil’s langweilig ist, scheiße aussieht und man im Kopf rumrechnen muß. Dann zieht ihr Euch aus /proc/$PID/fd einfach den Filedeskriptor und übergebt ihn an das folgende Skript (“Danke” übrigens an den KSPLICE-Typen):

#!/bin/bash
fd=/proc/$1/fd/$2
fdinfo=/proc/$1/fdinfo/$2
name=$(readlink $fd)
size=$(wc -c $fd | awk '{print $1}')
while [ -e $fd ]; do
  progress=$(cat $fdinfo | grep ^pos | awk '{print $2}')
  echo $((100*$progress / $size))
  sleep 1
done | dialog --gauge "Progress reading $name" 7 100

Der erste Parameter ist dabei die PID und der zweite der FD. Ich hoffe, das war bunt genug!