Wie erstelle ich eine eigene Shell?

4 Antworten

1 Geht, habe ich schon oft gemacht (viele Lösungen auf programmieraufgaben.ch sind Java-Konsole-Lösungen)

2. Dazu musst Du die Zeilen "parsen" also "vw XYZ" wird auseinandergenommen (entweder mit "split", einer REGEX, einem String-Tokenizer, der APACHE-CLI-Library oder von Hand, wie es Dir am Besten behagt). Danach kannst du die Java-File-Befehle aufrufen z. B. "new File("XYZ")", listFiles, ... was es halt so in "java.io.File" gibt. Das aktuelle Verzeichnis kannst Du ja immer in der Konsole vor dem Befehl angeben, damit der Benutzer auch weiß, wo er gerade steht. Ob es schlauer ist, das CurrentWorking Directory zu verschieben, oder einfach ein globaler String mit dem aktuellen Verzeichnis abzuspeichern, weiß ich nicht. Müsste ich erst etwas ausprobieren. Die zweite Variante [String akt = new File(".").getAbsolutePath() oder ähnlich] muss in jedem Fall funktionieren.

3. Hier einige Vorschläge
vw: Verzeichnis wechseln
bnw: bilde neues Verzeichnis
kill: löschen (Achtung nicht ganze Verzeichnisse, sonst legst Du Dir noch ein Ei)
list: Verzeichnis Inhalt ausgeben
listr: Verzeichnis rekursiv ausgeben
list *.txt: Pattern-Suche
schieb a b: schiebe Datei 'a' ins Verzeichnis 'b/'
find <pattern>: Suche rekursiv nach allen Files und Ordnern mit dem pattern

Die Frage auch, ob es nicht einfacher ist, die Linux-Shell-Befehle aus Java heraus aufzurufen, dann brauchst Du unter Umständen nicht einmal neue Namen zu erfinden und hättest eine sehr mächtige Shell, welche Du um Deine eigenen Befehle ergänzen könntest.


gerlochi 
Beitragsersteller
 21.10.2015, 06:43

@phigeek Habe meine eigene Shell nun fertig! Aber mit C#. Leiser kann man sie dann unter Linux nicht benutzen :(

1
GWBln  22.08.2015, 19:19

Wenn Du Kurzformen für beliebige Kommandos haben willst, kannst du das mit alias erledigen, z.B.

alias md='mkdir -p'
alias mv='mv -viu'
alias ScanDevices='find /dev/disk/ -exec ls -l {} \; |grep dev/disk'

Das Erste ist eine Konzession an DOS/Windows,
das Zweite gibt dir etwas Sicherheit beim Bewegen/Umbenennen.

Damit funktionierende Aliase nicht -- nach Neustart -- immer wieder neu eingegeben werden müssen, packe sie in die Datei

$HOME/.alias bzw $HOME/.bash_aliases

und überprüfe, ob eine dieser Dateien auch aktiviert wird. Kandidaten:

.profile
.bashrc

0
gerlochi 
Beitragsersteller
 21.08.2015, 23:13

Danke das ist sehr hilfreich!

0

was ist jetzt die Frage?

Ist diese Shell für deine eigene Linux-Distribution vorgesehen?

https://www.gutefrage.net/frage/kennt-wer-ein-paar-gute-namen?foundIn=user-profile-question-listing

Programmierer, wenn sie mal groß werden wollen, fangen klein an, dazu gehören dann Fleiß, Ausdauer, Probieren, Verwerfen, neu anfangen...

Wer aber schon andere nach einem Namen für seine eigene Distribution fragen muss, dem fehlt wohl doch etwas.


Wenn man wirklich eine eigene Shell ( im Sinne von äußere Schale ) schreiben will, dann fängt man an, alle gewünschten Funktionen aufzuschreiben. Dabei hört es sich lächerlich an, das Suchen nach  Befehlsnamen   ( wv , cd ... ) an exponierte Stelle zu setzen. Bei der Festlegung solcher Namen ( Buchstaben-Kombinationen) wirst die immer Kompromisse abschließen müssen, denn wv ist dann schon für Arbeitsplatz

"w
ütend verlassen"

 vergeben.


Woher ich das weiß:Berufserfahrung – openSuSE seit 1995

gerlochi 
Beitragsersteller
 15.10.2015, 21:23

und neeigene programmiersprache, so verrückt bin ich dann auch nicht

0
gerlochi 
Beitragsersteller
 15.10.2015, 21:22

bin spät drann aber, keine bessere shell, sondern eine eigene ;). ne bessere ist für mich fast unmöglich

0
gerlochi 
Beitragsersteller
 22.08.2015, 11:29

Nein es ist nicht fuer meine eigene Distribution. Und den Namen meiner Distrubution ist mir am ende alleine eingefallen... Irgendwie (ist so) hast du recht, diese Fragen zu den Namen sind unnoetig. Meine Linux Distribution sollte Linux Nista heissen, habe das Projekt aber verworfen, es war nachher einfach zu unfertig und instabiel.

Ich weiss das es sich echt laecherlich anhoert mit, ich suche Namen und so, aber manchmal faellt mir echt nichts ein weil ich mit dem Code beschaeftigt bin.

Das mit den Befehlen ist ja so ne Sache, im Sinne von "vw" meine ich "Verzeichnis Wechseln" (in Latein: "Mutatio Presul", also "mp").

Ich habe auh schon nachgedacht ob ich das mit Latein machen will, da ich die Sprache so mag. 

Das mit dem Programmieren stimmt und ich habe noch viel for mir. Das ich so manche Programme versucht habe zu entwickeln und du sehen wirst das ich noch ganz unten bin versuche ich mal was neues. Denn ein Programm das mit der DOS Box (Windows CMD) kommuniziert habe ich schon mal geschrieben. Wie du gesagt hast, ich versuche es nur, wenn es klappt (also das Programm mit der Shell kommuniziert und die Shell antwortet) gehe ich weiter.


Ich kann erst (falls es noch eine rueckmeldung gibt) inj c.a. 3 Tagen antworten.

0
Linuxhase  23.08.2015, 14:45
@gerlochi

@gerlochi

in Latein: "Mutatio Presul", also "mp").

Ich habe auh schon nachgedacht ob ich das mit Latein machen will, da ich die Sprache so mag. 

Du kannst natürlich für alle Kommandos, bei denen es in der lateinischen Sprache einen passenden Begriff gibt, einen alias anlegen und so eine lateinische Shell simulieren.

Für wen das nachher sinnvoll oder nötig ist, steht auf einem anderen Blatt. Denn wenn Du das mit allen Kommandos machen willst, dann ist es möglicherweise einfacher den Quellcode der bash zu nehmen und daraus eine lash (lateinshell) compilieren, die man dem Latein sprechenden User dann als Benutzershell gibt

/etc/passwd Eintrag:

lazarus:x:1000:100::/home/lazarus:/bin/lash

Linuxhase

0
guenterhalt  23.08.2015, 16:03
@Linuxhase

@Linuxhase

ist es überhaupt das Ziel von gerlochi, einfach nur andere Bezeichnungen für eine Funktion zu finden? Er will eine bessere Shell, besser als sh, csh, ksh, tcsh, tclsh ... bash und was es sonst noch alles gibt. Es ist doch offensichtlich viel zu primitiv einfach nur neue Namen mit alias zu definieren. Im nächsten Schritt wir er versuchen so eine Shell mit seiner eigenen Programmiersprache zu programmieren. Dafür fehlt wohl lediglich der Compiler. ....

0

1. Verwechsel nicht Shell mit Konsolenprogramm. Ein Konsolenprogramm läuft auf der Shell.

2. Es ist problemlos möglich, aber ich fürchte, du bist noch lange nicht so weit.


gerlochi 
Beitragsersteller
 21.10.2015, 06:43

FERTIG ;)

0
gerlochi 
Beitragsersteller
 15.10.2015, 21:27

jop

0
gerlochi 
Beitragsersteller
 22.08.2015, 11:33

2. Es ist problemlos möglich, aber ich fürchte, du bist noch lange nicht so weit.

Naja mal sehen, eine eigene richtige echte Shell wird es ja nicht sondern nur ein Kommunikations-Programm zwischen der Shell und meinem Programm, es uebersetzt meine Befehle zu den Shell befehlen und sagt es ihr denn.


0
PerfectMuffin  22.08.2015, 14:27
@gerlochi

Das kann eigentlich jeder, der weiß, was System.in ist. Hängt halt vom Umfang ab.

0

Hallo

ich moechte gerne eine eigene Shell mit..... Java Programmieren! ;)

Das ist doch Unsinn, JAVA ist eine Laufzeitumgebung, während eine Shell direkt mit dem Kernel interagiert. Ich glaube kaum dass das Deine Absicht ist.

Ist es moeglich mit Eclipse eine Java-Konsolen Aplikation zu erstellen?

Bitte sehr:

Beschreibung: SWT is the software component that delivers native widget functionality for the Eclipse platform in an operating system independent manner. It is analogous to AWT/Swing in Java with a difference - SWT uses a rich set of native widgets.

.

Wie mache ich wenn 1 klappt die Ausfuehrung des Befehls? ALso ich weiss das ich es mit if mache, also falls der Scanner gleich (zb) "vw "+d dann soll in das verzeichnis von D gewechselt werden. In C ging das immer mit System("CD"); oder so, aber wie in Java?

  1. Das hängt doch davon ab welche Kommandos Du Deiner Shell beibringst.
  2. Weißt Du denn was das Wort if übersetzt heißt?
  3. Der "Scanner" ist ein Wert!

DESCRIPTION:

The if command evaluates expr1 as an expression (in the same way that expr evaluates its argument).

Linuxhase

Woher ich das weiß:eigene Erfahrung – Ich benutze seit 2007 Linux und habe LPIC101 und LPIC102

gerlochi 
Beitragsersteller
 21.08.2015, 23:11

Danke

Manchmal machen mich deine verbesserungen echt wuschig :D. Ich bin erst ** Jahre! Naja :D

Und keine richtige Shell, nur sozusagen ein Schwarzes Fenster das meine eigenen Befehle iuebersetzt und zum Terminal rueberschickt, das dann eine antwort gibt.

Naja also if hoer sich wie falls oder wenn an. Und ich weiss das der Scanner ein Wet ist. ich dachte mir das so:

d ist ein String und ich habe es mal ohne den ganzen schnickschnack vor Scanner  = new Scanner gemacht (nachher mach ich es richtig).

Scanner s = new scanner
if(s=="vw"+d){
CODE DER DAs VERZEICHNIS ZU D WECHSELT
}
0
Linuxhase  23.08.2015, 14:20
@gerlochi

@gerlochi

Und keine richtige Shell, nur sozusagen ein Schwarzes Fenster das meine eigenen Befehle iuebersetzt und zum Terminal rueberschickt, das dann eine antwort gibt.

Also möchtest Du mit einem, für Dich eindeutigeren, und/oder kürzeren Kommando, ein komplexes Kommando starten; dafür gibt es Alias-Kommandos, z.B.:

alias mangrep="man grep"

Das wäre jetzt nicht wirklich sinnvoll, weil es wohl genauso lang ist. Also mal etwas richtig komplexes:

alias showopenports="MYROUTER=$(/usr/sbin/traceroute google.de|head -n2|tail -n1|cut -d'(' -f2|cut -d')' -f1) && /usr/bin/nmap -sS -O $MYROUTER"

(Pfade an die Deiner Distribution anpassen!!) Damit brauchst Du dann nur noch das Alias-Kommando:

showopenports

auszuführen und bekommst in Wirklichkeit alle offenen Ports Deines Gateways (Routers) und das dort verwendete Betriebssystem  angezeigt. Hier eine Beispielausgabe meines Linux-Routers:

......
PORT STATE SERVICE
23/tcp filtered telnet
80/tcp open http
.....
Running: Linux 2.6.X
OS CPE: cpe:/o:linux:linux_kernel:2.6
OS details: Linux 2.6.32 - 2.6.39
.......

Die Alias-Kommandos gehören in die Datei /home/$USER/.bashrc (wo sicher schon einige stehen) eingefügt um auch nach einem Reboot noch da zu sein. Man beachte den führenden Punkt im Dateinamen!

Linuxhase

0
Linuxhase  23.08.2015, 14:31
@Linuxhase

Ein if muß auch immer mit einem fi enden:

S="vw"
if [ $S == "vw" ];
 then
cd / && echo "Du bist in $PWD angekommen"
f

Linuxhase

0