Aktuelle Zeit: 11.07.2020 19:12

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Test ob ein Programm installiert ist
BeitragVerfasst: 28.06.2019 22:23 
Offline

Registriert: 26.04.2019 10:31
Wohnort: Mühldorf am Inn
Hallo,
wie kann ich feststellen, ob ein Programm oder eine lib installiert ist?
Auf der Shell würd ich's so machen:
$1 = "openssl"
if [[ -f $(which $1 2>/dev/null) ]]
then
echo "$1 vorhanden"
else
echo "bitte $1 installieren!"
fi

Danke im Vorab
Kurt

_________________
Wenn einem die einfachen Dinge net einfallen, klappt's meistens umständlich...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Test ob ein Programm installiert ist
BeitragVerfasst: 29.06.2019 14:13 
Offline
Benutzeravatar

Registriert: 06.08.2005 22:56
Wohnort: Gernsbach
Der einfachste Weg ist hier die Verwendung von RunProgram() mit deinem "which" Aufruf in Verbindung mit ProgramExitCode():

Code:
EnableExplicit

Procedure ProgramExists(program$)
  Protected program = RunProgram("which", program$, "", #PB_Program_Open | #PB_Program_Wait)
  If IsProgram(program)
    If ProgramExitCode(program) = 0
      ProcedureReturn #True
    EndIf
  EndIf
 
  ProcedureReturn #False
EndProcedure

If ProgramExists("openssl")
  Debug "Program existiert"
Else
  Debug "Programm existiert nicht"
EndIf

_________________
BildBildBildBild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Test ob ein Programm installiert ist
BeitragVerfasst: 30.06.2019 10:45 
Offline

Registriert: 26.04.2019 10:31
Wohnort: Mühldorf am Inn
Guten Morgen,
danke... das war ein guter Denkanstoss...
Ich bekomm bei deiner Variante immer False zurück, egal wie ich wende oder drehe, aber k.A. warum's nicht funktioniert, eigentlich sollte which bei Erfolg 0 zurück geben, sonst 1
Aber so klappt's:

Code:
EnableExplicit
Global program
Global Exitcode.s

Procedure ProgramExists(program$)
  program=RunProgram("which", program$, "", #PB_Program_Open | #PB_Program_Error | #PB_Program_Read)
 
  If program
      While ProgramRunning(program)
      Exitcode = ReadProgramString(program) 
      Wend
      CloseProgram(program)
  EndIf
 
  If Exitcode <> ""
        ProcedureReturn #True
      Else
        ProcedureReturn #False       
  EndIf
EndProcedure

If ProgramExists("openssl")
  Debug "Program existiert"
Else
  Debug "Programm existiert nicht"
EndIf

_________________
Wenn einem die einfachen Dinge net einfallen, klappt's meistens umständlich...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Test ob ein Programm installiert ist
BeitragVerfasst: 30.06.2019 11:09 
Offline
Benutzeravatar

Registriert: 20.04.2006 09:50
Du überschreibst Exitcode jedesmal, lieber anhängen:
Code:
Procedure ProgramExists(program$)
  Exitcode = ""
  ...
      Exitcode + ReadProgramString(program)
Vielleicht solltest du vorher auch jedesmal AvailableProgramOutput() überprüfen.
Im Übrigen funktionieren bei mir beide Varianten, Ich würde aber ProgramExitCode() bevorzugen.

_________________
my pb stuff..
Bild..jedenfalls war das mal so.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Test ob ein Programm installiert ist
BeitragVerfasst: 30.06.2019 11:43 
Offline

Registriert: 26.04.2019 10:31
Wohnort: Mühldorf am Inn
Danke, das mit der Variable löschen werd ich berücksichtigen...
Obige Variante funktioniert bei mir nicht mit which, mit whereis schon... seltsam...
Finde dass whereis besser geeignet ist, weil which nur nach Executable sucht.

Dank und schöne Grüsse
Kurt

_________________
Wenn einem die einfachen Dinge net einfallen, klappt's meistens umständlich...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Test ob ein Programm installiert ist
BeitragVerfasst: 30.06.2019 12:00 
Offline
Benutzeravatar

Registriert: 20.04.2006 09:50
was gibt denn which openssl und whereis openssl im terminal aus? Wenn du keine binary hast aber z.B. eine include, dann gibt dir which nichts zurück, whereis aber schon.

_________________
my pb stuff..
Bild..jedenfalls war das mal so.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Test ob ein Programm installiert ist
BeitragVerfasst: 30.06.2019 12:26 
Offline

Registriert: 26.04.2019 10:31
Wohnort: Mühldorf am Inn
which gibt aus:
/usr/bin/openssl

whereis:
openssl: /usr/bin/openssl /usr/include/openssl /usr/share/man/man1/openssl.1ssl.gz

Geht auch darum, fehlende oder Versionen einer lib zu erkennen und den Benutzer aufzufordern die richtige nachzuinstallieren.
whereis gibt bei nicht gefunden trotzdem z.B. "Topenssl:" aus, also muss ich den den Ausgabestring im einfachsten Fall mit len auswerten...

_________________
Wenn einem die einfachen Dinge net einfallen, klappt's meistens umständlich...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Test ob ein Programm installiert ist
BeitragVerfasst: 30.06.2019 20:02 
Offline
Benutzeravatar

Registriert: 20.04.2006 09:50
Was funktioniert denn bei Programies Variante nicht? Wenn es an IsProgram() liegt, dann versuche mal den vollen Pfad für which anzugeben, also z.B. /usr/bin/which.

_________________
my pb stuff..
Bild..jedenfalls war das mal so.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Test ob ein Programm installiert ist
BeitragVerfasst: 30.06.2019 20:48 
Offline

Registriert: 26.04.2019 10:31
Wohnort: Mühldorf am Inn
Hallo,
du hattest Recht... mit /usr/bin/which funktioniert es einwandfrei. :D
Mit whereis kommt aber immer True zurück, auch wenn die Datei gar nicht existiert. Mit Programies Variante kann ich leider den Rückgabestring nicht auswerten, weil #PB_Program_Wait und #PB_Program_Read nicht miteinander kombinierbar ist.
Hab jetzt meine Version so abgeändert:

Code:
EnableExplicit
Global program
Global Exitcode.s
Global program$

Procedure ProgramExists(program$)
  program=RunProgram("whereis", program$, "", #PB_Program_Open | #PB_Program_Error | #PB_Program_Read)
  Exitcode=""
  If program
      While ProgramRunning(program)
      Exitcode= ReadProgramString(program) 
      Wend
      CloseProgram(program)
  EndIf
 
  If Len(Exitcode) > 1+Len(program$)
        ProcedureReturn #True
      Else
        ProcedureReturn #False       
  EndIf
EndProcedure

program$="liblrdf.so.0"
If ProgramExists(program$)
  Debug program$ + " existiert"
Else
  Debug program$ + " existiert nicht"
EndIf

_________________
Wenn einem die einfachen Dinge net einfallen, klappt's meistens umständlich...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Test ob ein Programm installiert ist
BeitragVerfasst: 30.06.2019 21:56 
Offline
Benutzeravatar

Registriert: 06.08.2005 22:56
Wohnort: Gernsbach
Noch ein kleiner Tipp am Rande: Nicht alle Variablen global deklarieren! Das kann schnell zu komischen Effekten führen wenn man innerhalb einer Procedure eine Variable überschreibt und diese dann außerhalb der Procedure auch abgeändert wird, da sie global ist.

Im Normalfall sollte man Variablen, welche nur innerhalb einer Procedure benötigt werden, als Protected deklarieren.

Das Beispiel von Sommertv würde ich so anpassen:

Code:
EnableExplicit

Procedure ProgramExists(program$)
  Protected program=RunProgram("whereis", program$, "", #PB_Program_Open | #PB_Program_Error | #PB_Program_Read)
  Protected Exitcode.s=""
  If program
      While ProgramRunning(program)
      Exitcode= ReadProgramString(program)
      Wend
      CloseProgram(program)
  EndIf
 
  If Len(Exitcode) > 1+Len(program$)
        ProcedureReturn #True
      Else
        ProcedureReturn #False       
  EndIf
EndProcedure

Define program$="liblrdf.so.0"
If ProgramExists(program$)
  Debug program$ + " existiert"
Else
  Debug program$ + " existiert nicht"
EndIf


Oder alternativ eine Variante welche auch schaut, ob nach dem ":" in der Ausgabe von whereis wirklich etwas steht:

Code:
EnableExplicit

Procedure ProgramExists(program$)
  Protected program = RunProgram("whereis", program$, "", #PB_Program_Open | #PB_Program_Read)
  Protected output$ = ""
  Protected paths$

  If program
    While ProgramRunning(program)
      output$ + ReadProgramString(program)
    Wend
    CloseProgram(program)
  EndIf

  ; output$ wenn program$ existiert:
  ; sh: /bin/sh /bin/sh.distrib /usr/share/man/man1/sh.1.gz
  ; output$ wenn program$ nicht existiert:
  ; foo:
  paths$ = Trim(StringField(output$, 2, ":"))

  ; paths$ is leer wenn program$ nicht existiert (keine Zeichen hinter ":")
  If Len(paths$)
    ProcedureReturn #True
  Else
    ProcedureReturn #False       
  EndIf
EndProcedure

Define program$="sh"
If ProgramExists(program$)
  Debug program$ + " existiert"
Else
  Debug program$ + " existiert nicht"
EndIf


Da der erwartete Output schon im Standardoutput steht, kann man auf das #PB_Program_Error Flag bei RunProgram() verzichten.

_________________
BildBildBildBild


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 24 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye