Ok, sich sehe schon, wir drehen uns irgendwie im Kreis
Also doch der Pseudocode. Als Beispiel nehme ich mal das allseits liebgewonnene "diff file1 file2"
Annahme:
Im Verzeichnis befinden sich die folgenden drei Dateien:
file1.txt
file2.txt
file3.txt
Ziel:
Ich moechte die Dateien miteinander vergleichen und die Unterschiede auf den Bildschirm sehen.
Aufruf in der Kommandozeile:"
Parsing der Eingabe (vom Interpreter/Shell)
1. Lese String #1 (in diesem Fall diff) und schreibe den Inhalt auf den Kommando Stack.
Am Anfang steht immer der auszufuehrende Befehl
2. Lese den Rest der Eingabe und schreibe den Inhalt auf den Stack Temp1.
Nach dem Kommando kommen weitere Optionen/Parameter/Dateinamen/Verzeichnisnamen etc.
3. Filtere den Inhalt von Temp1. Die Divider zwischen den einzelnen Elementen sind die Leerzeichen. Es werden also zwei Elemente erkannte, naemlich
und
4.
Code:
<HasWildcard>
for i=0;i<length(e[]);++i do:
{
Enthaelt i ein *? (Ja/Nein)
{
Wenn ja:
Goto <MakeArray>
Wenn nein:
passiert nix
}
}
Enthaelt das Element ein Wildcard, dann wird die Prozedur <MakeArray> ausgefuehrt.
5. <MakeArray>
Die Prozedur <MakeArray> sucht nach Dateien, welche mit "file" beginnen und die Endung "txt" haben. Also quasi identisch mit dem herkoemmlichen Befehl "l file*.txt". Alle Treffer werden in das Array "HitTable_i[]" geschrieben. (Ueber dynamische Variablennamenerzeugung machen wir uns jetzt mal keine Gedanken
)
Die Prozedur <HasWildcard> laueft also zweimal durch und ruft jeweils die Prozedur <MakeArray> auf. Dabei werden die beiden Arrays "HitTable_0" und "HitTable_1" geschrieben. Der Inhalt der Arrays lautet wie folgt:
Code:
HitTable_0 = {file1.txt, file2.txt, file3.txt};
HitTable_1 = {file1.txt, file2.txt, file3.txt};
6. Stapelverarbeitung
Zu guter Letzt wird nun das Kommando diff ausgefuehrt:
Code:
<BatchExecute>
for i=0;i<length(HitTable_0[]);++i do:
{
for j=0;j<length(HitTable_0[]);++j do:
{
diff HitTable_[i] HitTable_[j];
}
}
Das Ergebnis davon waere equivalent zu einem neunmaligen aufrufen von "diff", genaugenommen:
Code:
diff file1.txt file1.txt
diff file1.txt file2.txt
diff file1.txt file3.txt
diff file2.txt file1.txt
diff file2.txt file2.txt
diff file2.txt file3.txt
diff file3.txt file1.txt
diff file3.txt file2.txt
diff file3.txt file3.txt
Ist die Idee jetzt verstaendlicher? Ansonsten gehen mir langsam die Optionen aus...
Ja aber genau dort liegt doch schon das Problem, wie Wolfgang bereits meinte: Die Gueltigkeit ist programmabhaengig
Kleines Missverstaendnis. Mit Gueltigkeit meine ich nicht die Gueltigkeit des Syntax, sondern lediglich die existierenden Datei-/Verzeichnisnamen, welche man mit dem Wildcard finden kann.
Stattdessen stellt die Shell dem Benutzer die Moeglichkeiten zur Verfuegung, dies gueltigen Kombinationen recht einfach zu generieren, angepasst auf das aufzurufende Programm. Das ist doch viel mehr, als das was Du haben moechtest, oder nicht?
Keine Frage, ich bin genauso froh wie du, dass es die Shell gibt, ehrlich. Und das ich damit so gut wie alles machen kann steht hier auch nicht zur Diskussion.
Mein Anliegen resultiert daraus, das nahezu alle Shellkommandos Operationen auf Dateien und Verzeichnisse bewerkstelligen. Von daher finde ich es gar nicht so abwegig eine moeglichst kompakte Moeglichkeit zu haben, um kommandos (welcher Art auch immer) auch auf verschiedene Dateien anwenden zu koennen. Und kompakter als Wildcards geht es nimmer
.
Wuerde ein Shell Interpreter sich um diese Funktionalitaet bereits kuemmern, dann muesste sich der Ersteller eines Programms ueberhaupt keine Gedanken mehr darueber machen. Ein Kommando wie z.B. das anfaengliche pstoepsi wuerde dann Problemlos auf multiple Dateien funktionieren, genauso wie eine Vielzahl anderer Kommandos. Ohne diese Funktionalitaet muss man entwerder hoffen, dass der Programmierer einen Parameter dafuer eingebaut hat, oder man schreibt sich halt ein Shell Skript (Was wie gesagt auch nicht zu beanstanden ist).