Unix-Äquivalent zu PowerShell?

21

Ich fand es immer umständlich, wenn komplexe Shell-Befehle das Parsen der Textausgabe mit AWK beinhalten . Grundsätzlich konvertieren wir strukturierte Daten in Text und analysieren den Text dann erneut, um die strukturierten Daten wiederherzustellen.

PowerShell ist eine Windows-Shell, die dieses Problem umgeht, indem Sie typisierte Objekte zwischen Shell-Befehlen anstatt nur Text umleiten können.

Gibt es Unix-Shells, die objektbasiert statt textbasiert sind, wie PowerShell?

Wim Coenen
quelle

Antworten:

24

Nein, es ist umgekehrt. Es gibt keinen Löffel ^ H ^ H ^ Strukturierte Daten. Es gibt nur Text.

Ein großer Teil der Unix-Philosophie basiert auf der Idee, Text auszugeben und Text als Eingabe zu akzeptieren. Vielleicht möchten Sie " The Art of Unix Programming " lesen , das eine nette Erklärung dazu enthält.

Verstehen Sie mich nicht falsch: Ich verstehe Ihren Standpunkt und weiß, worauf Sie abzielen. Es gibt Dinge wie die interaktiven Interpreter von Ruby und Python, die als Shell verwendet werden können, aber sie sind für grundlegende Aufgaben nicht so freundlich wie Bash. Versuchen Sie beispielsweise, das Verzeichnis zu ändern.

Auch die Verwendung von Objekten in einer Shell ist nicht alles. Wenn dies nur von Ihrer Shell unterstützt wird, sind Sie unter Unix ratlos. Alle Standard-Unix-Textbearbeitungswerkzeuge müssten geändert werden, wie grep, awk, sed usw.

Ich glaube, es gab vor ein paar Jahren einen Versuch, so etwas zu kreieren, aber ich kann mich nicht an den Namen erinnern und habe lange nicht mehr davon gehört. Es wird wahrscheinlich nicht abheben.

wzzrd
quelle
2
Interessanterweise würde das Ersetzen von Textströmen (oder tatsächlich Byteströmen) durch Datenobjektströme nicht gegen die im Buch formulierten allgemeinen Prinzipien verstoßen. Es scheint sogar besser mit der "Repräsentationsregel" zu spielen. Es ist nur so, dass Unix Textströme als Schnittstelle zwischen Programmen ausgewählt hat.
Wim Coenen
1
Aber mit "Datenobjekt" meinen Sie ein tatsächliches Python / Ruby / C ++ - Objekt oder so etwas wie eine C-Struktur?
Wzzrd
3
+1 "Versuchen Sie nicht, den Löffel zu biegen, das ist unmöglich. Versuchen Sie stattdessen nur, die Wahrheit zu erkennen ... es gibt keinen Löffel." Es ist nicht so sehr Text als Schnittstelle, sondern Datenströme als Schnittstelle. Objekte eignen sich gut zum Programmieren, aber manchmal werden sie zu einem winzigen Gefängnis, in das man sich hineinversetzen kann ...
Avery Payne
2
zsh> bash. Meine Meinung, aber wirklich, wenn Sie zsh nicht ausprobiert haben, sollten Sie
Xenoterracide
2
@WimCoenen, Versand um "strukturierte Daten" bedeutet, dass jeder und Tante Tillie sich einig sein müssen, was die "Struktur" ist. Sogar solche Sachen ls(1). Völlig nutzlos.
Vonbrand
10

Es gibt tatsächlich ein Projekt namens Pash , das auf die Implementierung von PowerShell (zusätzlich zu Mono) abzielt, aber es scheint ins Stocken geraten zu sein.

Mark Probst
quelle
2
Unix-Hacker verbringen Zeit mit Microsoft-basierten Projekten = das ist die Ameise und die Heuschrecke
ixtmixilix
4
Wir sind zurück von den Toten: github.com/JayBazuzi/Pash , twitter.com/PashProject
Jay Bazuzi
4

Es gibt ein Projekt, dessen Ziel Ähnlichkeit mit PowerShell hat: Hotwire . Es kombiniert reguläres sh mit Python-Scripting und einer Fenster- / Grafikumgebung. Sie könnten es sich ansehen.

Es basiert auf einer objektorientierten Pipeline , die Sie mit Ihren eigenen Objekten erweitern können, indem Sie vorhandene Programme einbinden oder Python-Bibliotheken verwenden.

Elmarco
quelle
1
Das ist das Projekt, an das ich mich erinnern wollte! Letzter Commit im Kofferraum: vor zwei Jahren ...
wzzrd
4

PowerShell wurde 2016 zu Open Source. Seitdem wird es immer plattformübergreifender. Der Quellcode ist auf GitHub verfügbar, ebenso wie Installationspakete für eine Reihe von UNIX-ähnlichen Systemen.

Tomasz
quelle
1

Ich würde denken, Sie könnten das meiste davon erreichen, indem Sie eine Reihe von interpretierten (oder kompilierten) Skripten schreiben und diese dann in der Interpreter-Shell aufrufen, wodurch Ihre Objekte zurückgegeben oder beibehalten werden und so weiter, wenn Sie möchten.

Sie können dies in mindestens Ruby, Perl, Python, Haskell (z. B. GHCi), JavaScript (z. B. node.js), Matlab und sicherlich in anderen Sprachen tun ...

Kevin Cantu
quelle
Die Pipe als Objekte bedeutet, dass Sie eine verzögerte Auswertung durchführen können. Wenn Sie also eine Reihe von Dateiobjekten in einer Pipe übergeben, interessieren Sie sich vielleicht für den Namen oder das Änderungsdatum, aber vielleicht auch für den Inhalt. Welche Daten übergeben Sie in JSON? Antwort: es kommt darauf an. Wenn der Verbraucher der Pipe Daten abruft, kann er die richtigen Daten anfordern. Problem gelöst.
Nigel Thorne
1

Ein weiterer Gedanke drei Jahre später: Es ist möglich, ein Objekt mithilfe von XML oder JSON mit einem Textstrom darzustellen. Ich bevorzuge JSON (einfacher), und tatsächlich gibt es Projekte, die den klassischen * NIX-Dienstprogrammen JSON-Unterstützung bieten. Zum Beispiel: https://github.com/step-/JSON.awk

Ein Problem bei der Verwendung eines Objekttypmodells für klassische * NIX-Programme wie AWK ist, dass sie keine OO-Unterstützung bieten. Während AWK beispielsweise über assoziative Arrays verfügt, sind die Arrays nicht mehrdimensional (jedes Element in einem AWK-Array muss eine Zahl oder eine Zeichenfolge sein; ein Array darf in AWK kein Array-Objekt sein).

samiam
quelle
Clojure bietet edn an, mit dem alle Arten von typisierten Daten serialisiert / deserialisiert werden können, während JSON begrenzt ist.
Mario