Spass mit bash "alias" oder wieso ist "which <command>" manchmal falsch?

Ich wollte gerade (mal wieder) schauen, wie schnell mariadb (10.0.3) im Vergleich zum MySQL Server ist, den ich auf meinem Mac lokal benutzte um Projekte zu entwickeln.

Dies ist prinzipiell recht einfach, da die MySQL Binär Dateien immer noch mit MariaDB kompatibel sind, man also eigentlich nur die Server Binaries austauschen muss um einen schnellen Test zu bewerkstelligen!

Frisch ans Werk! MariaDB 10.0.3 ist als "development" version leicht über Homebrew installierbar:

Falls man noch eine alte (5.5) Version installiert hat, muss man diese erst einmal flink entfernen:

brew unlink mariadb

Dann die aktuelle development Version aufspielen:

brew install --devel mariadb

Soweit so gut!

Was mich dann allerdings total verwirrt hatte war, dass "mysql --version" weiterhin das "apple-darwin MySQL" war und nicht wie erwartet "MariaDB".

> mysql --version
/usr/local/mysql/bin/mysql  Ver 14.14 Distrib 5.1.68, for apple-darwin10.3.0 (i386) using readline 5.1

> which mysql
/usr/local/bin/mysql

> ls -l /usr/local/bin/mysql
lrwxr-xr-x  1 user  admin    34B  9 Nov 18:10 /usr/local/bin/mysql -> ../Cellar/mariadb/10.0.3/bin/mysql

> /usr/local/bin/mysql --version
/usr/local/bin/mysql  Ver 15.1 Distrib 10.0.3-MariaDB, for osx10.9 (i386) using readline 5.1

????

Erstmal grosses staunen. Vielleicht sehr ihr es aber auch direkt?

Jedenfalls bin ich dann irgendwann drauf gestossen, dass mysql --version den Pfad zu meiner MySQL Installation enthält /usr/local/mysql/bin/mysql. Es wird also ganz klar dieses Binary verwendet.

Aber wieso?

Mein erster Gedanke war natürlich, dass ich einen Pfad Eintrag für das bin Verzeichnis von MySQL habe. Doch sollte which mysql dann auch den Pfad zu diesem Binary anzeigen. Wieso wurde aber etwas anderes ausgeführt?

Bei der Kontrolle des Pfades in meiner .bashrc ist es mir dann ins Auge gesprungen. Da ich zu faul war immer mysql -u root einzugeben, befindet sich dort folgende Zeile:

alias "mysql"="/usr/local/mysql/bin/mysql -u root"

So einfach ist des Rätsels Lösung! Dieses Alias hat eine höhere Priorität als das Executable, welches über den Pfad geladen wird. Der which Befehl berücksichtig aber kein Alias und gibt daher die Datei aus, welche normal benutzt würde!

P.S.: MariaDB ist für reale Anwendungen oftmals deutlich schneller als MySQL. Gemessen bei einer PHP basierte Webseite mit > 880.000 Queries ist MariaDB z.B. 20% schneller!

comments powered by Disqus