Gambas: Shell

Aus Wikibooks


Zurück zu Gambas


Man kann die Linux Shell von Gambas aus ansprechen und nutzen. Wie das geht zeigen die folgenden Beispiele:

Ls unter Gambas[Bearbeiten]

Das folgende Beispielprogramm zeigt, wie man sich die Dateien eines Verzeichnisses der Festplatte in einer Textarea anschauen kann.

Man braucht eine Textarea und einen Befehlsbutton, um das Programm in gang zu bringen.

' Gambas class file
PUBLIC Content AS String
'Get the content of a directory
PUBLIC SUB Button1_Click()
  SHELL "ls -la > /tmp/result" WAIT
  Content = File.Load("/tmp/result")
  Textarea1.text = content
END

Man kann den String mit dem Namen Content aus dem Programm entfernen, wenn man die Textarea direkt mit dem Fileload füllt.

  Textarea1.text = File.Load("/tmp/result")

Noch ein Beispiel: Unterverzeichnisse anschauen[Bearbeiten]

Man braucht eine Textarea und 2 Befehlsbuttons, um das Programm in Gang zu bringen.

PUBLIC SUB Form_Open()
 ME.Text = "Unterverzeichnisse anzeigen - Wählen Sie einen Pfad"
 ME.X = 200
 ME.Y = 50
 ME.Width = 1200
 ME.Height = 600
 Button1.Text = "Unterverzeichnisse anzeigen"
 Button1.X = 16
 Button1.Y = 16
 Button1.Width = 300
 textarea1.Text = "" 
 textarea1.x = 16
 textarea1.y = 56
 textarea1.width = 700
 textarea1.height = 500
 Button2.Text = "Ende"
 Button2.X = 340
END
PUBLIC SUB Button1_Click()
DIM t AS String 
IF Dialog.SelectDirectory() THEN RETURN
t  = Dialog.Path
SHELL "ls -ld " & t & "*/. > /tmp/result" WAIT
Textarea1.text = File.Load("/tmp/result")
END
PUBLIC SUB Button2_Click()
 ME.Close
END

Im ersten Unterprogramm Form_Open werden nur einige Einstellungen für die 3 Steuerelemente vorgenommen. Im 2, Unterprogramm Button1_Click steht der eigentlich wichtige Code: Zunächst wird ein string t deklariert. Dann wird eine Dialogform zur Auswahl des Verzeichnisses geöffnet. Das ausgewählte Verzeichnis (Dialog.path) wird dem String t übergeben. Mit dem Shell Befehl werden alle Unterverzeichnisse von Dialogpath in eine temporäre Datei gespeichert. Diese Datei wird geladen und in der Textarea angezeigt.

wc = wordcount unter Gambas[Bearbeiten]

Im folgenden Programm wird der Linuxbefehl wc , der die Zeilen, die Worte und die Zeichen eines beliebigen Textes zählt, innerhalb eines Gambasprogrammes genutzt.

Um das Programm in Gang zu bringen braucht man:

  • 2 Befehlsbuttons
  • 1 Textarea ( Hier wird der zu untersuchende Text eingegeben)
  • 1 Textbox ( Hier wird das Ergebnis des wordcount ausgegeben)

Der Code dazu:

PUBLIC t AS String
PUBLIC SUB Form_Open()
 Textarea1.Text = "Dies ist ein Test"
 Textbox1.Text = "" 
END
PUBLIC SUB Button1_Click()
 File.Save(system.Home & "/test.txt",TextArea1.Text)
 CATCH 
 IF ERROR THEN RETURN
END
PUBLIC SUB Button2_Click()
 SHELL "wc " & system.Home & "/test.txt > /tmp/result" WAIT
 t = File.Load("/tmp/result")
 textbox1.Text = t
END
  • Mit dem Befehl 1 wird der Inhalt der Textarea in einer Datei test.txt abgespeichert.
  • Mit dem Befehl 2 wird diese Datei test.txt einem wordcount unterzogen. das Ergebnis in der Datei /tmp/result abgespeichert.
  • Diese Datei wird dann wieder in die Textbox geladen und angezeigt.

Etwas umständlich aber es geht. Der String t ist eigentlich überflüssig und kann aus dem Programm entfernt werden wenn man

textbox1.Text = File.Load("/tmp/result")

schreibt.

cp = Kopieren unter Gambas[Bearbeiten]

Beispiel 1: Eine Datei kopieren

Sie benötigen auf ihrer Form:

  • 2 Dirviews
  • 2 Fileviews
  • 1 Button
   Public Sub Button1_Click()
   Dim sFile As String
   Dim sStr,sStr2 As String
       sStr = DirView1.Current & "/"
       sStr2 = DirView2.Current 
       (sStr2= Dirview2,Current & "/")
       sFile = sStr & FileView1.Current
       Exec ["cp", "-v", sFile, sStr2] Wait 
       DirView1.Reload
       DirView2.Reload
   End 

Der Slash in (sStr2) würde bewirken, das zusätzlich ein Verzeichnis angelegt wird. Wählen sie in Dirview2 ein Verzeichnis aus und in Fileview1 eine Datei, klicken sie auf Button1.

Nachdem Reload der Dirviews sehen sie die kopierte Datei im Verzeichnis von Dirview2.

Beispiel 2: Ein Verzeichnis kopieren

   Public Sub Button1_Click()
   Dim sFile As String
   Dim sStr,sStr2 As String
       sStr = DirView1.Current & "/"
       sStr2 = DirView2.Current 
       For Each sFile In Dir(DirView1.Current)
       sFile = sStr & sFile
       Exec ["cp", "-v", sFile, sStr2] Wait 
       Next
       DirView1.Reload
       DirView2.Reload
   End

Sie können den EXEC-Befehl durch den SHELL-Befehl ersetzen:

   Shell "cp -v " & sFile & " " & sStr2 Wait

rm = Löschen unter Gambas[Bearbeiten]

Beispiel 1: Löschen einer Datei mit Nachfrage

Sie benötigen auf ihrer Form:

  • Dirview
  • Fileview
  • Button
   Public Sub Button1_Click()
       Select Message.Question("Datei löschen?", "Ja", "Nein")
       Case 1
       Exec ["rm", "-r", DirView1.Current & "/" & FileView1.Current] Wait
       FileView1.Reload
       Case 2
       Return
       End Select
   End     

Beispiel 2: Löschen eines Ordners mit Nachfrage

   Public Sub Button1_Click()
       Select Message.Question("Ordner löschen?", "Ja", "Nein")
       Case 1
       Exec ["rm", "-r", DirView1.Current] Wait
       DirView1.Reload
       Case 2
       Return
       End Select
   End

Sie können den EXEC-Befehl durch den SHELL-Befehl ersetzen. Voher muß die Datei oder das Verzeichnis mit einem String deklariert werden.

Besonderheit mit rm und dem SHELL-Befehl:

   Eine Datei zb Meine Audio.datei wird rm nicht löschen, da rm diese Datei als zwei
   Dateien betrachtet. Die Datei müsste MeineAudio.datei heissen. Dies gilt nur mit 
   dem SHELL-Befehl. Mit EXEC wird rm auch Meine Audio.datei löschen.
   Dim sStr As String  
   sStr=Dirview1.Current & "/" & Fileview1.Current (Datei)
   sStr=Dirview1.Current (Verzeichnis)  
   Shell "rm -r " & sStr Wait

mv = Verschieben unter Gambas[Bearbeiten]

  • 2 Dirviews
  • 2 Fileviews
  • 1 Button

Verschieben einer Datei mit mv

   Public Sub Button1_Click()
   Dim sFile As String
   Dim sStr As String
   Dim sStr2 As String
       sStr = DirView1.Current & "/"
       sStr2 = DirView2.Current & "/"
       sFile = sStr & FileView1.Current 
       Shell "mv -i " & sFile & " " & sStr2 Wait
       DirView2.Reload
       DirView1.Reload
   End