{"id":924,"date":"2012-12-19T21:16:57","date_gmt":"2012-12-19T20:16:57","guid":{"rendered":"http:\/\/www.butschek.de\/?p=924"},"modified":"2012-12-20T08:13:57","modified_gmt":"2012-12-20T07:13:57","slug":"scriptverzeichnis","status":"publish","type":"post","link":"https:\/\/www.butschek.de\/2012\/12\/19\/scriptverzeichnis\/","title":{"rendered":"Scriptverzeichnis finden"},"content":{"rendered":"

\"Verzeichnis-Icon\"<\/a>Ich bastel oft kleine Scripte, die mir irgendwelche Aufgaben abnehmen und meist auch nicht lange leben. Oft arbeite ich bei solchen Helper-Scripts nicht so 100% sauber. Zum Beispiel erstelle ich h\u00e4ufig keine saubere tempor\u00e4re Datei mit tmpfile, sondern benutze einfach ein File im aktuellen Verzeichnis. Oder ich ben\u00f6tige eine Eingabedatei f\u00fcr das Script und benutze einfach „input.txt“ statt das File per Commandline zu \u00fcbergeben.<\/p>\n

Dabei fiel ich schon einige Male darauf herein, dass solche Scripte oft nicht richtig funktionieren, wenn man sich beim Starten nicht im Verzeichnis des Scripts befindet. Wenn man das Script z.B. unter \/usr\/local\/bin ablegt und es sp\u00e4ter vom Home-Verzeichnis (~) aus starten (mit \/usr\/local\/bin\/script.sh), wird er die Datei „input.txt“ nat\u00fcrlich im Home-Verzeichnis suchen und nicht dort, wo ich sie abgelegt habe.<\/p>\n

Ein einfacher Trick, dies global zu l\u00f6sen: Gleich am Anfang des Scripts mit cd in das Verzeichnis wechseln, in dem das Script liegt. Aber wie findet das Script heraus, wo es liegt?<\/p>\n

Die Variable $0 enth\u00e4lt den Scriptnamen, wie er auf der Kommandozeile aufgerufen wurde. Starten wir das Script mit \/usr\/local\/bin\/script.sh enth\u00e4lt $0 den String „\/usr\/local\/bin\/script.sh“. Sind wir schon im richtigen Verzeichnis, w\u00fcrden wir es mit .\/script.sh starten. So enth\u00e4lt $0 auch nur „.\/script.sh“.<\/p>\n

Das Kommando dirname hilft uns weiter. W\u00e4hrend basename den Dateinamen aus einem vollst\u00e4ndigen Pfad l\u00f6st, holt dirname nur den Pfad heraus:<\/p>\n

# basename \/usr\/local\/bin\/script.sh\r\nscript.sh<\/pre>\n
# dirname \/usr\/local\/bin\/script.sh\r\n\/usr\/local\/bin<\/pre>\n
# basename .\/script.sh\r\nscript.sh<\/pre>\n
# dirname .\/script.sh\r\n.<\/pre>\n

Nun hilft uns „.“ nat\u00fcrlich nicht sehr weiter, um das tats\u00e4chliche Verzeichnis herauszufinden. Aber das ben\u00f6tigen wir ja auch gar nicht, denn es gen\u00fcgt ja, den relativen Pfad zu erhalten, um mit cd dorthin zu wechseln. Und das funktionier auch mit dem aktuellen Verzeichnis „.“ ohne Probleme.<\/p>\n

Nun starten wir unser Script wie folgt:<\/p>\n

#!\/usr\/bin\/env bash\r\ncd $(dirname $0)<\/pre>\n

Das „dirname $0“ bringt das Verzeichnis zum Vorschein, so wie es auf der Kommandozeile eingegeben wurde (also absolut oder relativ zum aktuellen Verzeichnis) und mit cd wechseln wir dorthin. Somit wechselt das Script immer in das Verzeichnis, in dem es selbst liegt.<\/p>\n

Klar, das ist nur, um die eigene Faulheit zu unterst\u00fctzen, eine saubere Programmierung w\u00e4re nat\u00fcrlich eher zu empfehlen, aber mir half diese Zeile schon recht oft, so dass ich sie meist schon \u00fcberall einsetze.<\/p>\n","protected":false},"excerpt":{"rendered":"

Ich bastel oft kleine Scripte, die mir irgendwelche Aufgaben abnehmen und meist auch nicht lange leben. Oft arbeite ich bei solchen Helper-Scripts nicht so 100% sauber. Zum Beispiel erstelle ich h\u00e4ufig keine saubere tempor\u00e4re Datei mit tmpfile, sondern benutze einfach ein File im aktuellen Verzeichnis. Oder ich ben\u00f6tige eine Eingabedatei f\u00fcr das Script und benutze […]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[4,5],"tags":[12,99,45,66],"_links":{"self":[{"href":"https:\/\/www.butschek.de\/wp-json\/wp\/v2\/posts\/924"}],"collection":[{"href":"https:\/\/www.butschek.de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.butschek.de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.butschek.de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.butschek.de\/wp-json\/wp\/v2\/comments?post=924"}],"version-history":[{"count":6,"href":"https:\/\/www.butschek.de\/wp-json\/wp\/v2\/posts\/924\/revisions"}],"predecessor-version":[{"id":928,"href":"https:\/\/www.butschek.de\/wp-json\/wp\/v2\/posts\/924\/revisions\/928"}],"wp:attachment":[{"href":"https:\/\/www.butschek.de\/wp-json\/wp\/v2\/media?parent=924"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.butschek.de\/wp-json\/wp\/v2\/categories?post=924"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.butschek.de\/wp-json\/wp\/v2\/tags?post=924"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}