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

elegantes Shellscript gesucht

brtz

Newbie
Für ein kleines Kunst-Projekt suche ich ein schlankes Shellscript das in etwa folgendes erledigt:
innerhalb des Arbeitsverzeichnisses liegt eine große Anzahl von Ordnern, die .jpg-Bilder (und evtl. auch andere Formate) enthalten. Mit Hilfe von asciiview aus dem aa-lib Paket sollen diese Bilder auf einer reinen Textkonsole (kein X) als ascii-art ausgegeben werden.

Meine bescheidenen Kenntnisse reichen nur so weit, den entsprechenden Befehl immer wieder auszuführen:

"asciishow.sh":
Code:
#!/bin/bash
cd /home/foo/project/pictures
#working directory mit einer großen Anzahl von .jpg Bildern

asciiview 1.jpg
sleep 3
clear

asciivew 1a.jpg
sleep 3
clear

cd /home/foo/project/morepictures
#es folgt eine Menge stupider Tipparbeit

asciiview zzz9x.jpg
sleep 3
clear

sh asciishow.sh
#wenn das script fertig ist, soll es sich selbst neu starten.
#End of script

Das lässt sich doch sicher eleganter mit Variablen lösen?
 

nbkr

Guru
Habs nicht getestet, könnte aber so gehen.

Code:
#! /bin/bash


while true; do

for i in `ls /pfad/zu/den/bildern/*.jpg*`; do

asciiview $i
sleep 3
clear 

done

done
 

regexer

Advanced Hacker
nbkrs Vorschlag ist nicht schlecht. Allerdings würde ich den ls weglassen...
Also:
Code:
for i in /pfad/zu/den/bildern/*.jpg*; do

asciiview $i
sleep 3
clear

done
Falls es mehrere Pfade gibt, kann man selbige einfachan den for hinten anhängen

Also:
Code:
for i in /pfad/zu/den/bildern/*.jpg /noch/ein/pfad/*.jpg; do
 
OP
B

brtz

Newbie
Vielen Dank, notoxp und besonders nbkr! Das script an sich funktioniert. asciiview ohne switches wartet jedoch auf die Eingabe [q] um zu quittieren. sleep 3 bringt also nix, da es erst zum Einsatz kommt, wenn eine Benutzereingabe erfolgt ist, um asciiview zu beenden.

Natürlich wäre es möglich asciiview unter anderem mit -driver stdout zu starten. Dann funktioniert es wie cat, und das script würde fortgesetzt werden.
Allerdings gehen dabei die Skalierung der Ausgabe und die Farben verloren.

Damit das passiert, was ich möchte, müsste folgendes ablaufen:
Code:
sende Tastendruck [q] in 3 Sekunden
	|	
starte asciiview mit nächstem Bild 
	|
nach 3 Sekunden quittiert [q] asciiview 
	|
fang wieder von vorn an

Ansonsten muss ich irgend eine andere Lösung finden.

offtopic: die Dokumentation zu aa-lib ist sehr dürftig. Sie ist unvollständig, in schlechtem Englisch und eher an Programmierer gerichtet. Jemand der gut tschechisch und englisch kann, sollte sich mal mit den Programmieren in Verbindung setzen, falls das Projekt noch gepflegt wird. Ist nämlich ´ne tolle Programmsammlung.
 

leanUX

Member
Hallo brtz,

ich hab Dir ein kleines Script geschrieben, damit sollte es so funktionieren wie Du es Dir gedacht hast.

Code:
#!/bin/bash

# Zeigt zyklisch alle Bilder im Verzeichnis <PathToImages> mit dem Programm imageview an
# Jedes Bild wird dabei fuer <SleepTime> Sekunden angezeigt
# Das Programm expect muss installiert sein

# Settings:
PathToImages=/home/leanUX/images
SleepTime=3


# Checken ob das Programm expect installiert ist
which expect > /dev/null
if [ $? -ne 0 ]; then
    echo "Fehler: Programm expect ist nicht installiert :("
    exit
fi

echo "Zum Abbruch ctrl-C einige Sekunden gedrueckt halten"
while [ 1 ]
do
  for CurrentFile in $PathToImages/*
  do
     expect -c "spawn asciiview $CurrentFile;  sleep $SleepTime; expect \"\" { send \"q\" }" > /dev/null
  done
done

greets
leanUX
 
OP
B

brtz

Newbie
danke leanUX,
dein Vorschlag scheint zu funktionieren, insoweit, dass die Programme nacheinander aufgerufen werden. Ich kann jedoch keine Bildschirmausgabe feststellen.
Hast du´s getestet?
ctrl-C funktioniert bei mir nicht.

achso, bei asciiview handelt es sich selbst um ein script, wie ich mittlerweile gemerkt habe:
Code:
#!/bin/bash
# asciiview - an ascii art image browser script. Front end for aview/aaflip

clear()
{
  kill $! 2>/dev/null
  if [ -n $ATMPDIR -a -d $ATMPDIR ]; then
	rm -f $ATMPDIR/aview$$.pgm 2>/dev/null && rmdir $ATMPDIR 2>/dev/null
  else
	echo "Cannot remove temporary directory $ATMPDIR"
	exit 1
  fi
}
myconvert()
{
   if anytopnm $1 >$ATMPDIR/aview$$.pgm 2>/dev/null ; then
     exit
   elif convert -colorspace gray $1 pgm:- 2>/dev/null ; then
     exit
   fi
   echo "Failed to convert file format to PNM by both convert and anytopnm" >&2
   while true; do
     echo "0 " 
   done
}
filenames=""
options=""
if [ "$1" = "" ]; then
  echo "$0 - an ascii art image/animation browser.

  To run this script you need aview, aaflip and NetPBM or ImageMagick.
  You may browse any graphics format supported by NetPBM or ImageMagick
  and .fli/.flc files.

  Usage:
   $0 [options] [filenames]

  type aview --help [enter] for list of options.
  "
  exit 1
fi
while [ "$1" != "" ]; do
  case $1 in
    "-font" | "-driver" | "-kbddriver" | "-mousedriver" | "-*width" | "-*height" | "-bright" | "-contrast" | "-gamma" | "-random" | "-dimmul" | "-boldmul")
      options="$options $1 $2"
      shift 
      shift 
      ;;
    -*)
      options="$options $1"
      shift
      ;;
    *) 
      filenames="$filenames $1"
      shift
      ;;
  esac
done
ATMPDIR=`mktemp -d` || exit 1 
trap clear 0
mkfifo $ATMPDIR/aview$$.pgm
outfile=$ATMPDIR/aview$$.pgm
for name in $filenames ; do
if test -r $name ; then
case $name in
*.fli | *.lfc | *.flic )
  PATH="$PATH:."
  aaflip $options $name
  ;;
*)
  myconvert $name >$ATMPDIR/aview$$.pgm &
  pid=$!
  PATH="$PATH:."
  aview  $options $ATMPDIR/aview$$.pgm
  kill $pid 2>/dev/null
esac
else
  echo "$name could not be opended"
fi
done
 

leanUX

Member
Hallo brtz,

ja, klar habe ich das Skript bei mir ( unter openSuSe 10.2 ) getestet, und es funktioniert einwandfrei. Die Bilder des im Skript angegebenen Verzeichnisses werden immer wieder nacheinander mit asciiview dargestellt, solange bis man in dem Terminalfenster in dem man das Script gestartet hat Crtl-C gedrückt hält. Hast Du denn die Skript-Variable PathToImages auch entsprechend angepasst, so dass hier auf Dein Bilder-Verzeichnis verwiesen wird? Ansonsten wüsste ich nicht wieso bei Dir keine Bilder dargestellt werden.
 
OP
B

brtz

Newbie
hi leanUX,

sorry hab´s unzureichend getestet und mich unzureichend ausgedrückt. Ich habs nur im runlevel 3 auf tty2 ausprobiert (weil auf tty1 noch der SuSE Hintergrund eingestellt ist).

Mit Hilfe von asciiview aus dem aa-lib Paket sollen diese Bilder auf einer reinen Textkonsole (kein X) als ascii-art ausgegeben werden.

und leider konnte ich dann auf keiner tty was sehen. Startet man asciiview direkt erfolgt normal die Ausgabe auf der tty die gerade ausgegeben wird. Ebenso mit den Scripts von nbkr und notoxp (nur eben mit dem q Problem).

Muss wohl mit expect zusammenhängen...

unter X (KDE) funktioniert es! Dann öffnet sich jedes mal wenn ein neues Bild kommt eine default Konsole mit der Ausgabe.
Im Endeffekt will ich auf der Maschine aber gar kein X laufen haben.

Hast dir eigentlich ein Bier verdient...
 
Oben