Das Grundrezept
Die Hauptaufgabe einer Shell ist die Systemverwaltung. Daher bieten sowohl die Bash [1] als auch die PowerShell [2] die notwendigen Befehle, um in den Verzeichnissen zu navigieren, Dateioperationen vorzunehmen und andere Programme aufzurufen. Auch das Verwalten der Systemkonfiguration stellt eine wichtige Aufgabe dar. Während die Bash dafür vorwiegend auf externe Programme zurückgreift, integriert die PowerShell einige wichtige Systemwerkzeuge. So bietet etwa in der PowerShell das CmdletGet-Process ein Gegenstück zu ps, während das Cmdlet Get-Content dem Programm less entspricht.
Um den Programmablauf zu steuern, benötigt eine Shell Elemente zur bedingten Ausführung. Eine definierte Anzahl von Durchläufen legen beispielsweise for oder while in Verbindung mit der Auswertung einer Variablen fest. Listing 1 vergleicht die Ausgabe eines Zählers mit for in PowerShell und Bash.
Eine for-Schleife in der Windows Vista Powershell:
PS:> for ($i=1;$i -le 3;$i++) { Write-Host $i }
1
2
3
PS:>Die gleiche Schleife in der Bash:
bash[~]$ for ((i=1;i<=3;i++); do echo $i; done 1 2 3 bash[~]$
Bei der Programmsteuerung durch Fallentscheidungen mittels if oder switch unterscheiden sich Bash und PowerShell nur wenig. Auch bei der Definition von Funktionen, der Nutzung von Umgebungsvariablen, dem begrenzte Gültigkeitsbereich von Variablen ("Scoping"), der Nutzung von regulären Ausdrücken und der Evaluation der Rückgabewerte von Programmen funktionieren beiden Shells recht ähnlich.
Eingeschränkte Starterlaubnis
Ein erster Unterschied zwischen PowerShell und Bash ergibt sich schon beim Aufruf eines Skript: Die PowerShell startet standardmäßig keine Skriptdateien und lässt sich daher nur interaktiv nutzen. Man kann sie aber dazu bringen, Skripte zu starten, sofern diese digital signiert sind. Eine solche digitale Signatur identifiziert den Autor des Skripts, denn nur er kann sie auf kryptografischem Weg erzeugt haben. Indem man das Signatur-Zertifikat des Skriptautors akzeptiert, bescheinigt man sein Vertrauen diesem gegenüber. "Fremde" Skripte dagegen führt die PowerShell erst einmal nicht aus. Um auch ohne Signatur ein Skript auszuführen, gilt es auf der Kommandozeile die Ausführungsrichtlinie (ExecutionPolicy) auf RemoteSigned zu setzen:
PS:> Set-ExecutionPolicy RemoteSigned
Nun akzeptiert die PowerShell alle lokalen Skripte. Stammen die Dateien dagegen aus einem Download oder sind sie per E-Mail angekommen, besteht die Shell weiter auf einer Signatur. Kommandodateien aus externen Quellen grundsätzlich nicht auszuführen, ist sicherheitstechnisch eine neue Qualität: Ein Skript-Virus wie "Love Letter" [3] verliert so jeden Schrecken.
Die Bash dagegen reguliert die Ausführungsberechtigung eines Skripts nicht über digitale Signaturen. Ob ein Skript ausgeführt werden darf, kontrollieren allein die im Dateisystem gesetzten Ausführungsberechtigungen.



