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

'read' abbrechen, geht das?

Hab hier ein kleines Script zum Abspielen von mp3's:

Code:
	for MP3 in $DIR ; do

		echo -n '> '$MP3
		play -q $DIR/$MP3 &

		pid=$!
		read
		kill $pid
	done

Also kann ich durch drücken von 'Enter' zum nächsten Stück springen.
Blöd ist nur, daß das 'read' natürlich ein drücken von 'Enter' erzwingt, selbst wenn das Stück zuende ist.
Nun könnte man ja eine Schleife bauen, die mit ps-A prüft, ob das aktuelle Stück noch läuft, und nur solange einen Abbruch mit 'read' ermöglicht.
Danach würde das 'read' praktisch abgebrochen und das nächste Stück fängt an.

Ok, natürlich kann man das laufende Stück auch mit ^c abbrechen, macht aber immer so eine unschöne Bildschirmausgabe. ;-)
Das die aktuelle Shell *immer* bei 'read' stehenbleibt, ist mir schon klar...

Gibt es eine Lösung, die den gewünschten Effekt bringt?
 
A

Anonymous

Gast
OsunSeyi schrieb:
Ok, natürlich kann man das laufende Stück auch mit ^c abbrechen, macht aber immer so eine unschöne Bildschirmausgabe. ;-)
na einen Tot muss man hier auf der Shell immer sterben
Code:
 play *.mp3
und vorsichtig mit ^C weiterspringen, aber nicht zu schnell hintereinander, da man play sonst abbricht. :D
OsunSeyi schrieb:
Das die aktuelle Shell *immer* bei 'read' stehenbleibt, ist mir schon klar...
dann eben bei read einen timeout setzen.
berechnen der genauen Abspiellänge und diesen Wert als timeout für read, ist wohl ein bisschen aufwendig, geht aber auch und wäre der richtige Weg

Aber versuchs mal mit dieser Spielerrei hier
Code:
for MP3 in $DIR
do
       echo -n '> '$MP3
       play -q $DIR/$MP3 &
       pid=$! 
       while [ -d /proc/$pid ] 
             do  
             read -t1 
             if  [ $? -lt 129 ]
                 then 
                 kill $pid 
                 continue 2 
            fi
      done
done
robi
 
Vielen Dank für den Tip, das 'read' einen Timeout hat, wusste ich nicht. Man kann sowas schwer googlen, "unix read" udergl bringt nichts. Und die 'man'-sites... naja, geht so und wird auch langsam besser. Eigentlich schade, daß es keine Übersetzungen zu geben scheint...

Die Länge der Stücke lässt sich garantiert herausfinden!
Danke, tom
 
Code:
LENGTH=`mplayer -ao null -identify -frames 0 $file 2>&1 | grep ID_LENGTH | sed 's|ID_LENGTH=\(.\+\)\..*$|\1|g'`
read -t $LENGTH
..funktioniert bestens. Hab aber gleich ein eigenes Script 'mp3lenght' daraus gemacht, um die Gesamtlänge von Zusammenstellungen bekommen zu können. ;)
 
A

Anonymous

Gast
OsunSeyi schrieb:
Vielen Dank für den Tip, das 'read' einen Timeout hat, wusste ich nicht. Man kann sowas schwer googlen, "unix read" udergl bringt nichts. Und die 'man'-sites... naja, geht so und wird auch langsam besser. Eigentlich schade, daß es keine Übersetzungen zu geben scheint...
dieses Kommando gehört zur Shell und ist in den Manpages der Bash-Builtins zu finden.
Code:
# which read
which: no read in (/usr/lib/jvm/java/bin:/home/robi/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games)

# man bashbuiltins
etwas abgekürzt und etwas übersichtlicher http://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html

robi
 
Code:
man read:

READ(2)                  Linux Programmer's Manual                  READ(2)

NAME
       read - read from a file descriptor

SYNOPSIS
       #include <unistd.h>

       ssize_t read(int fd, void *buf, size_t count);
~~~~~~~~~~~~~~~~
read --help
bash: read: --: invalid option
read: usage: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
funktioniert hier, naja, von -t timeout ist auch ausdrücklich die Rede. Manchmal ist man halt doof...
Bin ich nicht drauf gekommen!
 
Auf die Gefahr hin, daß ich nerve...
Code:
	for NAME in $NAMES ; do

		echo -n '> '`echo $NAME | sed 's|__.*||g'`' '

#		Fehlerausgaben von 'play' betreffs der Aussteuerung unterdrücken:

		play -q $DIR/$NAME 2>/dev/null &
		pid=$!

#		mindestens solange wie das Stück läuft (sonst wird uU der Rest abgeschnitten)
#		stelle 'read' zur Verfügung:

		sec=$(( `mp3length $DIR/$NAME` + 1 ))
		read -t $sec

#		damit 'kill' nur in Aktion treten kann, solange 'play' garantiert läuft,
#		denn sonst kommt es zu einer Fehlermeldung während das Stück wechselt
#		'kill: (875) - No such process'. Die Pid könnte aber in der Zeit an einen
#		anderen Prozess vergeben worden sein... Wohl eher nicht, aber korrekt:

		test=`ps -A | egrep "^$pid.*play$"`

		if [ -n "$test" ] ; then kill $pid ; fi

	done
Die Ausgabe:
Code:
~ | playlist -all
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  013  Ejeka Jojo / Gigbowaka
  026  Musical Experiment / Otofo Gigbowaka Dank
  084  Nordholz 10 / Track20
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> 013 > 026 
> 084 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  031  Musical Experiment / Kpanlogo
  049  Musik aus Westafrika / Kpanlogo
  109  Sokutu Wowo / Kpanlogo
  059  Nordholz 09 / Track09
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> 031 > 049
> 109 > 084
sieht doch ordentlich aus? An den Zeilenumbrüchen wurde abgebrochen.
 
Probier' doch mal hier

http://www.cpan.org/scripts/Audio/MP3/index.html

das Perl-Skript "shufflemp3-0.8.pl". Macht ungefähr das, was Du Dir vorgestellt hast, auch bzgl. "read" (dafür verwendet es das Perl-Modul "Term::ReadKey").
 
Oben