Fangen Scripte unter Mac auch so an?
#!/bin/bash
"Unter Mac" ist nur die Tischplatte. Oder vllt auch deine Oberschenkel...

Und ja, natürlich. Ein korrektes "Shebang" ist das A und O eines jeden Interpreterprogramms. Egal welches OS, egal welche Sprache (die damit klargestellt wird) und egal welcher Rechner. Diese Konvention ist deutlich älter als Unix und stammt noch aus der Zeit der rein mechanisch aufgebauten Hollerith-Maschine.
"Shebang" als verkürzt gesprochenes "
Shalt use this ... program to run. Bang!"; Bang==Ausrufezeichen (engl. Slang)
Damit wird der zu startende Interpreter definiert, der folgendes Skript abarbeiten soll (und optional noch einige Aufrufparameter dazu).
Fehlt diese Angabe, wird die Standard-Shell des Benutzers verwendet, und das muss nicht unbedingt die richtige sein. Also ist das ein *muss*.
Ich habe einen iPod, der hat einen Unterordner "bash" und dort liegt die datei script.
Wenn ich die Dort ausführe, kann ich dann den befehl so ausführen?
cp ~/test ./
Jein.
Du musst zunächst mittels "cd ....." in diesen Ordner wechseln, um ihn zum "aktuellen Arbeitsverzeichnis" zu machen.
Beim Start des Skripts ist ein anderer Ordner als $PWD (=="present working directory") vordefiniert. Je nach der Methode mit der das Skript gestartet wird, ist das meist dein Benutzerordner oder das Wurzelverzeichnis ('/').
Um auf elegante Weise in denjenigen Ordner zu wechseln, in dem sich auch das gerade laufende Skript befindet, kannst du folgendes Konstrukt benutzen:
Code:
cd $(dirname "$0")
cp ~/test .
Jetzt befindest du dich aber in einem Ordner auf dem externen Volume, und solange das dein $PWD ist, darfst du das Volume nicht auswerfen. Du musst also dieses Volume erst wieder verlassen bevor du das Medium abmelden kannst (oder das Ende des Skripts erreicht haben - was aber nicht geht, denn das möchtest du ja auch gleich in diesem Skript erledigen...).
Du müsstest also (neben evtl weiteren Aktionen) folgendes tun:
Code:
cd $(dirname "$0")
cp ~/test .
cd ~
[I][COLOR="DarkSlateGray"]# ...andere Aktionen, und dann auswerfen.[/COLOR][/I]
Oder aber (noch eleganter) du wechselst erst gar nicht dort hin und verwendest stattdessen das cp-Kommando etwas anders, setzt das gewünschte Ziel gleich dort ein:
Code:
cp ~/test $(dirname "$0")
diskutil eject "Volume Label"
Oder aber (nochmals etwas draufgesetzt) du ermittelst auch noch den Namen des auszuwerfenden Volumes mittels dieser Methodik. Das sähe dann (etwas fortgeschrittenerer) so aus:
Code:
cp ~/test $( dirname "$0" )
diskutil eject $( stat -f %Sd "$0" )
Ja, das gilt (grundsätzlich) für jedes Shellkommando.
(Besser formuliert: Wenn du klug bist, gehst du immer davon aus, auch wenn es gerade mal nicht zutrifft.)
Aber... mach einfach das oben beschriebene, dann brauchst du den Namen gar nicht zu kennen. Das dort eingesetzte 'stat'-Kommando beschafft dir die nötige Information "on the fly", und zwar immer zuverlässig richtig.
Erklärung: In der oben verwendeten Form gibt 'stat' den "
Device-Identifier" des Geräts zurück, auf dem sich die mittels
"$0" angegebene Datei befindet, das ganze
formatiert als
String, also in Klartextform. Dieser Ausgabetext von 'stat' wird dann durch das umschliessende '
$( ...
)' in den 'diskutil'-Befehl eingesetzt.
(Wenn du genau hinsiehst, findest du die roten Stellen im Kommando)
Unter Linux hat man *.sh für die Scripte
Ungeliebte Tatsache: Linux ist weitreichend ein System von und für Amateure/Autodidakten.
Da machten (und machen) sich viele Unsitten breit.
Welches Suffix würdest du empfehlen?
Für nur unter OS X verwendbare Skripten ist *.tool angemessen.
Für plattformneutral gehaltene Dinge empfiehlt sich *.command
(weil dieses Suffix auch in anderen Systemen bekannt ist und dort ähnlich verwendet wird)
Aber das ist nur Konvention zur Klarstellung,
funktionieren wird das alles auch ganz ohne irgendein Suffix.
Werden beide standardmäßig von Terminal.app geöffnet?
Ja. Solange du nicht selbst was anderes definierst jedenfalls.