Unix-Befehlsinterpreter selbst schreiben

Sanicx

Sanicx

Grünschnabel
Hallo,

ich hab da ein Problem mit dem schreiben eines eigene Befehlsinterpreters. Dieser eigene Interpreter soll nur ausführbare Dateien mit maximal 2 Optionen starten.

Weiß von euch vielleicht jemand, wie das funzt? Ich steh mal wieder voll auf'm Schlauch!
 
Du könntest dir einfach eine minimale Shell schreiben oder ein Skript nutzen.

Code:
#!/bin/bash
$1 $2 $3

Dieses könnte man z.B. als 'command.sh' abspeichern und dann entsprechend mit

Code:
command.sh <befehl> <parameter1> <parameter2>

ausführen. Sind mehr als 2 Parameter vorhanden, werden diese einfach ignoriert.
 
Aber die Aufgabe besteht leider darin, den Interpreter als C-Programm zu implementieren.
 
Ich glaube er will eher wissen mit welcher/welchen Funktion/Funktionen in C/C++ man externe Programme aufrufen kann. Oder kA, vielleicht will er auch erstmal wissen, wie man user-Eingaben "managed", oder er will wissen wie man etwas auf dem Bildschirm ausgibt. Genau spezifiziert hat er das Problem ja nicht... Genausowenig wie die verwendete Sprache, wobei ich dank der Platzierung des Threads in diesem Subforum eine gewisse Vorahnungen habe, welche Scriptsprachen quasi diametral gegenüber steht.. (Und bash erst recht, auch wenn man es "bash-Skript" nennt.. Außerdem wäre dein Skript kein (interaktiver) Interpreter bitmuncher, so hatte ich das Post nämlich verstanden..)
 
ich hab da ein Problem mit dem schreiben eines eigene Befehlsinterpreters. Dieser eigene Interpreter soll nur ausführbare Dateien mit maximal 2 Optionen starten.

Weiß von euch vielleicht jemand, wie das funzt? Ich steh mal wieder voll auf'm Schlauch!

Ich glaube, er will, das wir seine Hausaufgaben komplett für ihn schreiben.

Weiß von euch vielleicht jemand, wie das funzt?

Wie was funzt? (Zu meinen Zeiten hieß das ja noch funktionieren, aber was weiß ich schon)

Du hast noch nicht mal angefangen mit der Aufgabe, oder?

Stell konkrete Fragen, wenn du hier Hilfe willst.
 
Hab garnicht auf den Bereich geachtet. Sorry. Ich hatte vor einiger Zeit mal eine minimale Shell gebastelt, aber das würde dank Job-Handling usw. wohl etwas zuviel sein. Ansonsten würde ich halt den Input einlesen, alle Argumente, die nicht sein dürften, vom Input-String abschneiden und das ganze an system() übergeben um es auszuführen. Die Frage ist halt, ob auch Sachen wie den Befehl im Hintergrund laufen lassen (also ein Job-Handling) u.ä. unterstützt werden müssen, dann wird das Ganze wohl etwas mehr.
 
Code:
man 3 system

Gruß Aqualung

Da wird er noch einige Manpages mehr lesen müssen. ;)
Einlesen des User-Inputs, String-Handling-Funktionen um überflüssige Parameter abzutrennen und ggf. auszulesen, ob ein '&'-Zeichen am Ende des Befehls ist und wenn auch noch ein echtes Job-Handling rein muss, wird er auch um Dinge wie tcsetpgrp(), perror() u.a. nicht herum kommen.
 
Hallo,

ich glaub ich hab einfach viel zu kompliziert gedacht. Es ging einfach nur darum, dass man in dem aufgerufenen Programm Befehle eingeben kann, die dann dort ausgeführt werden.

Also bisher hab ich das hier:
Code:
int main()
{
   char *kommando[] = {"date", "who", "pwd"};
   int zahl;
   printf("\n Bitte wählen Sie ein Kommando aus!");
   printf("0 : date\n 1 : who\n 2 : pwd\n");
   scanf("%i", zahl);

   execlp(kommando[zahl], kommando[zahl], 0);
   printf("Falsche Zahl. Kein Kommando verfügbar.");
   return 0;
}

Jetzt soll jedoch das Kommando nicht über eine Zahl, sondern direkt über den Befehl aufgerufen werden können. Wenn ich mein Programm dahin verändere, erhalte ich immer die Ausgabe Systemzugriffsfehler.
Muss ich die Datei zum auslesen der Befehle vielleicht in ein anderes Programm auslagern?
 
Du musst einen Parser schreiben, entweder von Hand oder du lässt ihn von einem Parsergenerator(z.b lex,bison,yacc) erzeugen.
 
Ich habe mal eine Frage am Rande:

Hat dein Programm so wie du es oben gepostet hat wirklich funktioniert? Ich kann mir das nämlich nicht vorstellen. Die scanf Funktion verlangt doch nach einer Typumwandlung in einen Integer zwingend einen Pointer auf einen Integer als zweites Argument. Da du zahl als normalen Integer definiert hast fehlt dir also noch ein Adressoperator.

Meiner Meinung nach müsste es also also so heißen:
Code:
scanf("%i", &zahl);
 

Ähnliche Themen

wget: Lädt bestimmte Dateitypen nicht

Hilfe für ein shell script

wget lädt furchtbar langsam

Port Forwarding mit iptables

Keine grafische Oberfläche (Debian Installation)

Zurück
Oben