Unix-Shells gibt es eine Menge, und hier im Forum dürften alle ihre wohlbegründeten Präferenzen haben. Was vielleicht weniger bekannt ist: Die PowerShell, die auf Microsofts .NET-Framework basiert, läuft auch unter Debian. Ob und inwiefern sie in dieser Umgebung eine Alternative zu den ganzen Unix-Shells darstellt, könnt ihr nun einmal selber ausprobieren.
Zum Einstieg soll man sich einiger grundlegender Unterschiede bewusst werden:
- Die PowerShell ist objektorientiert, während Unix-Shells textbasiert arbeiten.
- Die PowerShell basiert auf dem .NET-Framework, während Unix-Shells selber relativ schlanke, alleinstehende Programme sind, welche andere Programme über textuelle Schnittstellen kombinieren.
- Die PowerShell wurde auf dem Reissbrett designed, während die Unix-Shells historisch gewachsen sind.
Auf das Skripting soll an dieser Stelle nicht eingegangen werden; wir begnügen uns mit Einzeilern, die aber dank Pipes doch recht nützlich werden können.
Installation
Die Ausgangslage ist eine frische Installation von Debian 12 “Bookworm” ohne GUI. Es wird ein Benutzer namens user verwendet.
Zunächst soll das .NET-Framework in der Version 8 anhand der offiziellen Anweisungen installiert werden, die ich hier abgekürzt wiedergebe.
Zunächst wird ein Paket für die Microsoft-Paketquellen installiert:
Code: Alles auswählen
$ wget https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
$ sudo dpkg -i packages-microsoft-prod.deb
$ rm packages-microsoft-prod.deb
Code: Alles auswählen
$ sudo apt update -y && sudo apt install -y dotnet-sdk-8.0
Die Installation soll auch gleich überprüft werden:
Code: Alles auswählen
$ dotnet --version
8.0.404
Code: Alles auswählen
$ dotnet tool install --global powershell
Code: Alles auswählen
echo 'export PATH="${PATH}:~/.dotnet/tools"' >> .profile
. ~/.profile
Code: Alles auswählen
$ pwsh
PowerShell 7.4.6
PS /home/user>
Hilfe und Namenskonvention
Das Hilfesystem muss zunächst aktualisiert werden, wozu eine “UICulture” angegeben werden muss, was wohl das Microsoft-Pendant zu einer Locale sein soll. Hierzu wird das Update-Help-Cmdlet (ausgesprochen: “Commandlet”) verwendet und mit dem entsprechenden Parameter aufgerufen, um das Hilfesystem in US-Englisch zu installieren.
Code: Alles auswählen
Update-Help -UICulture en-US
Code: Alles auswählen
Get-Help Registry
Code: Alles auswählen
Help Registry
Code: Alles auswählen
Get-Command
Code: Alles auswählen
Get-Command -Verb Remove
Get-Command -Noun Process
Code: Alles auswählen
Get-Alias -Name echo
Code: Alles auswählen
Get-Command -Noun Alias
- cd PATH -> Set-Location -Path PATH
- mkdir FOLDER -> New-Item FOLDER -ItemType Directory
- dir -> Get-ChildItem
- ls /etc | head -25 -> Get-ChildItem -Path /etc | Select-Object -First 25
Ein weiteres grundlegendes Konzept der PowerShell sind die sogenannten Provider, wodurch verschiedene Datenquellen wie das Dateisystem, Umgebungsvariablen, die Registry usw. mit einer möglichst einheitlichen Schnittstelle zugreifbar gemacht werden sollen.
Diese Datenquellen werden durch die Angabe von einem Drive-Präfix voneinander unterschieden:
- Registry: HKLM für HKEY_LOCAL_MACHINE und HKCU für HKEY_CURRENT_USER
- FileSystem: C für das Laufwerk C:\ und Temp für temporäre Daten
- Environment: Env für Umgebungsvariablen
Code: Alles auswählen
Get-Command -Noun *Item*
Einige Anwendungsbeispiele hierzu:
- Erstellen einer neuen Umgebungsvariablen FOO=123 und anschliessendes Auslesen des Wertes:
- Set-Item -Path Env:/FOO -Value 123
- Get-Item -Path Env:/FOO
- Erstellen eines Verzeichnisses foo im Dateisystem:
- New-Item foo -ItemType Directory
- Setzen der Registry-Einstellung EnableAeroPeek auf den Wert 0 (nur unter Windows):
- Set-ItemProperty -Path dwm -PSProperty EnableAeroPeek -Value 0
Objekte
Die PowerShell arbeitet nicht textbasiert sondern objektorientiert. Werden Ergebnisse von Befehlen per Pipe an den nächsten Befehl weitergeleitet, betrifft dies nicht die textuelle Repräsentation des Objekts, sondern das Objekt als Ganzes. Die Ausgabe unterscheidet sich dadurch vom übergebenen Wert.
Objekte werden standardmässig tabellarisch dargestellt, wobei nur eine Untermenge ihrer Properties tabellarisch dargestellt wird:
Code: Alles auswählen
Get-ChildItem -Path /etc
Code: Alles auswählen
Get-ChildItem -Path /etc | Get-Member -MemberType Property
Code: Alles auswählen
Get-ChildItem -Path /etc | Get-Member -MemberType Method
Code: Alles auswählen
Get-ChildItem -Path /etc | Select-Object -Property FullName,CreationTime
Code: Alles auswählen
Get-ChildItem -Path /etc | Select-Object -Property FullName,CreationTime | Sort-Object -Property CreationTime
Code: Alles auswählen
Get-ChildItem -Path /etc | Where-Object -Property Name -Like *net*
Dies soll nur eine kurze Einführung in die PowerShell sein. Freundet man sich erst einmal mit den Konzepten an, kann man auch unter Windows recht produktiv arbeiten. (Die hier verwendete Syntax ist aus didaktischen Gründen überaus umständlich gewählt. In der Praxis muss man dank verschiedener Abkürzungsmöglichkeiten wesentlich weniger Tipparbeit leisten.) Wichtig ist, dass Microsoft mittlerweile konsequent darauf achtet, dass sich alle Administrationsaufgaben über entsprechende Cmdlets vornehmen und sich dadurch automatisieren lassen. Das ist ein grosser Fortschritt gegenüber der “Click-Ops”-Welt, mit der man Windows-Systemadministratoren lange Zeit verbunden hat.
Wer mehr über die PowerShell erfahren will, dem empfehle ich das Buch Learn PowerShell in a Month of Lunches (4. Ausgabe) von Manning. Eine pragmatische Zusammenfassung davon findet sich in meinem GitHub-Repository learning-powershell.
Unter Debian werde ich für den Alltag sicher bei der Bash bleiben; einfach, weil diese überall anzutreffen ist. Unter Windows sehe ich die PowerShell aber als eine Chance vom hektischen Klicken zum Automatisieren zu kommen.
Was hält ihr von der PowerShell?