Strg + c in einem Bash Skript abfangen

Ab und an benötigt man eine neue public IP, sei es um irgendwelche Seiten mit nervigen Ref-Links auszutricksen oder weil einem die aktuelle Zahlenfolge nicht gefällt;).

Ich erledige das seit Ewigkeiten mit ein paar Curl Befehlen die in ein Skript gepackt sind. Gerade eben hatte das Skript jedoch versagt. Nachdem mit Strg+ c den Ablauf abgebrochen hatte war die Leitung getrennt. Die Kabelomi trifft keine Schuld, der Connect Befehl lief einfach nicht durch. Mit dem Befehl „trap“ kann man das Problem aus der Welt schaffen:

#!/bin/bash
# traptest.sh

trap "echo Booh!" SIGINT SIGTERM
echo "pid is $$"

while :			# This is the same as "while true".
do
        sleep 60	# This script is not really doing anything.
done

Statt den User zu erschrecken wird einfach eine Funktion aufgerufen die die Verbindung herstellt.
Wer auch keine Lust hat bekannte mit Ref-Links zu nerven kann sich das Skript anschauen. Ich habe es auf meiner zentralen Müllhalde abgelegt.

Standardanwendung für 1-n Dateitypen ändern

Mplayer ist der Medienplayer meiner Wahl. Auch wenn ich Nautilus verwende möchte ich dieses tolle Programm benutzen. In den Eigenschaften einer Videodatei kann ich das auch einstellen.

Leider werden nun nur Dateien mit der Endung .avi geöffnet. Für ogv, mkv, flv müßte ich den Vorgang nochmal ausführen. Nicht schön . Nun habe ich mir diesen Vorgang genauer angesehen. Wenn ich einen Doppelklick mache schaut der Dateimanager in der Datei  /usr/share/applications/defaults.list welches Programm dem Datentyp zugeordnet ist. Wenn man diese Standardeinstellung überschreibt wird ein Eintrag in der Datei /~/.local/share/applications/mimeapps.list für die Datei angelegt.

In der mimeapps.list stehen z.B. solche Einträge für Videos

video/3gpp=totem.desktop

video/dv=totem.desktopvideo/fli=totem.desktop

video/flv=totem.desktopvideo/mp4=totem.desktop

video/mp4v-es=totem.desktop

video/mpeg=totem.desktop

video/msvideo=totem.desktop

Da auf dem Laptop ein frisches Ubuntu 10.10 installiert ist wird jegliches Videomaterial mit Totem abgespielt. Eine Änderung der Verknüpfung per Maus erzeugt einen Eintrag in der mimeapps.list:

video/x-avi=userapp-mplayer-CSECRV.desktop;

Woher der Rattenschwanz -CSERV kommt kann ich noch nicht sagen. Um nun für alle Videos den mplayer zu nutzen habe ich diesen toĺlen Befehl gebastelt:

grep video /usr/share/applications/defaults.list |sed  ’s/=totem.desktop/=userapp-mplayer-CSECRV.desktop;/g‘ >> ~/.local/share/applications/mimeapps.list

Das klappt natürlich auch mit anderen Dateitypen und Programmen. Allerdings sollte bei sed ein eleganterer Suchbegriff gewählt werden.  Ich hätte dieses Problem wirklich gerne per Point and Click erledigt. Leider hatte ich kein Programm dafür gefunden. Vielleicht kann mir da jemand einen Tipp geben:).

Nachtrag

Becha hat mich auf das Programm Ubuntu Tweak aufmerksam gemacht um solche Zuweisungen zu ändern. Klappt auch hervorragend. Vielen Dank:)

Gonzo hat mich auf meine holprige Verwendung von cat und grep hingewiesen. Ich habe den Befehl geändert und mir (mal wieder) vorgenommen diesen Befehl effektiver zu nutzen.

cat x| grep y

braucht kein Mensch. Merci 🙂

Weniger Dank schulde ich dem Spamvogel, der Samstags zu später Stunde nichts besseres zu tun hat als dumme Kommentare hier zu hinterlassen. Sollte ich dich jemals im RL treffen werde ich Deine Seele verspeisen.

Matroska Headercompression vs. WDTV

Seit geraumer Zeit bin ich Besitzer eines oder einer WDTV Live. Das Gerät steht unter meinem Fernseher und dient nur dem Zweck Filme die auf dem NAS abgelegt sind auf meinem Fernseher abzuspielen. Das Gerät kommt mit so ziemlich allen Formaten klar – abgesehen von manchen Mkv Dateien. Nach kurzer Recherche stand fest, dass dies mit der Headercompression zusammenhängt, doch was hat es damit auf sich?

Matroska ist ein Containerformat, das heißt in einem Matroska Container liegen die eigentlichen Dateien wie Audio und Videospuren, Untertitel usw. Im Header des Containers wird beschrieben welche Dateien enthalten sind und von welchem Typ sie sind. Die Matroskaspezifikation besagt, daß dieser Header auch komprimiert werden kann. Leider ist dieses Feature in den meisten Hardwareplayern anscheinend nicht implementiert obwohl die Spezifikation schon recht alt ist. Das war nie ein Problem bis sich Matroska entschloss die Headercompression standardmäßig in der aktuellen Version ihrer Tools zu aktivieren. Wenn man nun vergisst beim Mergen das entsprechende Flag zu setzen oder ein Mkv File von einem Bekannten bekommt, der solche Sorgen sieht man nur einen schwarzen Bildschirm.

Abhilfe schafft bei mir dieses kleine Bashscript. Die Mkv Tools müssen installiert sein. Die paar Zeilen machen nichts anderes als eine Prüfung auf Headerkomprimierung und ggfs. den Container ohne Kompression nochmal zu mergen. Das kann erfahrungsgemäß ein wenig dauern:

#!/bin/bash

function hascompression()
{
en=’Algorithm: 3 (header removal)‘
de=’Algorithmus: 3 (Entfernen von Kopfdaten)‘
mkvinfo $1 | grep -e „$en“ -e „$de“ &>/dev/null
ret=$?
if [ $ret -eq 0 ]
then
echo „komprimierte Header in $1“
return 0
else
echo „nichts komprimiertes gefunden in $1“
return 1
fi
}
#function
function removecompression()
{
hascompression $1

if [ $? -eq 0 ]
then

mv $1 $1.bak
mkvmerge -o „$1“ –engage keep_bitstream_ar_info -A -S –compression -1:none „$1.bak“ -D -S –compression -1:none „$1.bak“ -A -D –compression -1:none „$1.bak“
rm $1.bak
echo fukr
fi

}
#function

onlyinfo=false
while getopts ‚:i‘ OPTION; do
case „$OPTION“ in
i) onlyinfo=true && shift;;
*) echo „Unbekannter Parameter“

esac
done

for ARG in $@
do
if [ -f $ARG ]
then
if [ $onlyinfo == true ]
then
hascompression $ARG
else

removecompression $ARG
fi
else
echo $ARG isn’t a file
fi

done

WordPress versaut leider die Einrückungen aber ein ordentlichen Texteditor sollte das wieder zurechtrücken. 🙂

Matthias hat sich die Mühe gemacht und ein Applescript erstellt um dem Matroska Container auch unter MacOS die Komprimierung zu rauben:

on open someDroppedAliases
set theAlias to first item of someDroppedAliases
tell application „Finder“
set filename to name of theAlias
set ParentFolder to container of theAlias
set the item_count to the number of items in the ParentFolder
set parentFolderAlias to ParentFolder as alias
end tell
set parentFolderPath to POSIX path of parentFolderAlias
set ausgabe to do shell script „mkvinfo “ & quoted form of POSIX path of someDroppedAliases
if ausgabe contains „Content compression“ then

do shell script „mkvmerge -o “ & quoted form of parentFolderPath & „clean_“ & quoted form of filename & “ –compression 1:none “ & quoted form of POSIX path of someDroppedAliases

tell application „GrowlHelperApp“
set the allNotificationsList to ¬
{„Reparieren“}

set the defaultNotificationsList to ¬
{„Reparieren“}

register as application ¬
„Growl AppleScript Sample“ all notifications allNotificationsList ¬
default notifications defaultNotificationsList ¬
icon of application „Mkvtoolnix“

— Send a Notification…
notify with name ¬
„Reparieren“ title ¬
filename description ¬
„Kompression erfolgreich entfernt.“ application name „Growl AppleScript Sample“
end tell
else
tell application „GrowlHelperApp“
set the allNotificationsList to ¬
{„Nichts zu reparieren“}

set the defaultNotificationsList to ¬
{„Nichts zu reparieren“}

register as application ¬
„Growl AppleScript Sample“ all notifications allNotificationsList ¬
default notifications defaultNotificationsList ¬
icon of application „Mkvtoolnix“

— Send a Notification…
notify with name ¬
„Nichts zu reparieren“ title ¬
filename description ¬
„Keine Kompression vorhanden“ application name „Growl AppleScript Sample“
end tell
end if
end open

Hf^^

Bequemer Bashskripte zusammenfriemeln

Momentan beschäftige ich mich verstärkt mit der Skripterei und muß sagen, daß mir dies erstaunlich schwer fällt. Leerzeichen wollten beachtet sein, ab und an müssen Pfade escaped werden und die Arbeit mit Arrays kotzt mich zum Teil richtig an. Aber es wird langsam besser :).

Sehr hilfreich ist ein eigenes bin Verzeichnis. Da meine Skripte nur und viel mit Dateien arbeiten – sonst würde ich es mit irgendwas anderem machen – sollte der Aufruf auch bequem sein.

Um nun nicht jedesmal sowas wie

./skripta -a -b -c ~/zeugs/bearbeitemich

Habe ich das Verzeichniss ~/bin angelegt. Dort liegen die Skripte an denen ich gerade werkel. Damit meine Bash auch weiß, daß es da Programme gibt, habe ich das Verzeichniss der PATH Variable hinzugefügt:

export PATH=$PATH:~/bin/

Damit Um die Sache permanent zu gestalten habe ich diesen Befehl meiner .bashrc hinzugefügt. Sehr schön:).

 

 

ls -l –color |more

Ls bietet schon recht vielfältige Optionen. Man kann dem Befehl gerade zu unglaubliches anhängen 🙂

Vor langer  Zeit betrachtete ich meine Daten unter anderem mit dem coolen Befehl

dir /p

Unter Linux geht das auch. Allerdings ein wenig holpriger, nämlich mit dem „Titelbefehl“. Mit einem Alias klappt es nicht wegen der Pipe.  Mit einer Funktion wird jedoch alles besser:

llm() {

command ls -hog –color „$@“| more ;

}

Nach kurzer Suche (5 Minuten waren es mir wert) fand ich dann ls -hog. Auch net schlecht. Kennt wer eine noch „luxoriösere Fassung des Befehls?

Prüfe ob ein Befehl vorhanden ist

Momentan skripte ich wieder ein wenig. Für mein Skript benötige ich das Kommando avimerge. Bis jetzt habe ich die Existenz von Befehlen mit which geprüft. Eleganter geht es meiner Meinung nach mit command:

# @(#) s1 finding command with bash

exists()

{

if command -v $1 &>/dev/null

then

return 1

else

echo „Command :$1 not found… exit“

exit -1 fi

}

##wich avimerge?

exists avimerge

Argumente an Alias weitergeben

Den meisten Leuten dürfte  bekannt sein, dass man einer Aliasfunktion Argumente übergeben kann. Mir war es neu / ich war noch nie auf die Idee gekommen sowas zu tun :). Ein Beispielaufruf:

create_audiobook ()
{
mpg123 -s $1 | faac -P -X -w -o $2 –
}
create_audiobook (){
mpg123 -s $1 | faac -P -X -w -o $2 -
}

$1 & $2 wären die Variablen, die gesetzt sein sollten für den Aufruf. Problematisch wirds, wenn nur ein oder gar kein Argument mitgegeben wird. Das kann man mit einer simplen If Abfrage validieren:

create_audiobook (){
expr1=$2
expr2=$1
if [ "$expr1" -a "$expr2" ]
then
	mpg123 -s $1 | faac -P -X -w -o $2 -
else
	echo "Usage: create_audiobook INPUTFILE OUTPUTFILE"
fi
}

Das Fleißsternchen bekommt man, wenn man die Existenz der Befehle vor der Ausführung abprüft:

create_audiobook (){
APP1=mpg123
APP2=faac

if which $APP1 &>/dev/null && which $APP2 &>/dev/null
then
	echo "$APP1 & $APP2 found"
else
	echo "Please install $APP1 & $APP2"
	exit
fi

expr1=$2
expr2=$1
if [ "$expr1" -a "$expr2" ]
then
	mpg123 -s $1 | faac -P -X -w -o $2 -
else
	echo "usage: create_audiobook INPUTFILE OUTPUTFILE"
fi
}
######create_audiobook konvertiert ein mp3 zu einer mp4 Datei

Mich würde an dieser Stelle noch interessieren, ob Ihr im Community Planeten an solchen Posts interessiert seid, oder ob ich solche Ergüsse für mich behalten sollte^^.