Comunidad Gambas-es
[SOLUCIONADO] ¿ Cómo encontrar el comando de consola que necesito para mi aplicación ?. - Versión para impresión

+- Comunidad Gambas-es (https://gambas-es.org)
+-- Foro: Gambas (https://gambas-es.org/forum-3.html)
+--- Foro: General (https://gambas-es.org/forum-4.html)
+--- Tema: [SOLUCIONADO] ¿ Cómo encontrar el comando de consola que necesito para mi aplicación ?. (/thread-279.html)

Páginas: 1 2


¿ Cómo encontrar el comando de consola que necesito para mi aplicación ?. - Shell - 17-02-2021

Buenas!.

Hace ya tiempo hice una pequeña aplicación que mostraba clones del multi-emulador M.A.M.E.
Este emulador tiene la opción desde línea de comandos de devolverte esos valores.
Tomando la salida del comando hice una aplicación de ejemplo.

[Imagen: Cl4lcuQ.png]

El nombre del comando ha ido cambiando con el paso del tiempo.
Para distros de 32 se podía llamar "mame32", para las de 64 "mame64"...y como último "mame" para resumir
y dejarla como única.

En la Mint 20.X el paquete de instalación, el binario de la aplicación es "mame"

Tengo algo así para no complicar el código pero lo mejoraré.

Código:
'Funciona con mame para una distro de 32 bits
  'lineacomando = "mame32 " & "-listclones " & Chr$(34) & TextBoxClones.Text & Chr$(34)
 
  'Funciona con mame para una distro de 64 bits
  'lineacomando = "mame64 " & "-listclones " & Chr$(34) & TextBoxClones.Text & Chr$(34)
 
  'Funciona con mame para una distro de 64 bits de Linux Mint 20.X
  lineacomando = "mame " & "-listclones " & Chr$(34) & TextBoxClones.Text & Chr$(34)

Entonces mi idea es encontrar el comando que existe en la distro y usarlo.

Si uso el comando "whereis" de bash me da tres respuestas.
Código:
whereis mame
Cita:mame: /etc/mame /usr/games/mame /usr/share/man/man6/mame.6.gz

- Donde se encuentra la configuración
- El ejecutable
- Supongo que el manual, cambios, etc.

Como es un juego , lo encontramos en /usr/games...pero podía haberse instalado en /usr/local/bin.../usr/bin/...
Imaginar que por alguna circunstancia no se encuentra en los habituales... Confused

¿ Cual creen que debería ser la mejor manera de encontrar el ejecutable o cualquier orden ?.

Claro que también tenemos la posibilidad que al ejecutar una orden que no existe instalada en el sistema, nos devuelva algo la consola  por la salida de error.

Una posible solución puede ser esta:

Almacenar toda la salida del comando "whereis" en un array. Descartar lugares y luego preguntar a cada una de estas salidas si el archivo es un binario y usarlo.

Saludos


RE: ¿ Cómo encontrar el comando de consola que necesito para mi aplicación ? - Shell - 17-02-2021

Comencemos con.  ¿ Qué es ?...

Código:
whatis which
Cita:which (1)            - Busca una orden
 
Vamos, que busca donde están los ejecutables.
¿ Y ahora usemos las llaves para que nos diga, cuales de los mame's  están instalado ?

Código:
which -a mam{e,e32,e64}

(La "e" es necesaria en todas las posibilidades a buscar).  Es que si solo escribo

Código:
which -a mame{32,64}

Buscaría mame32 y mame64, cosas que no están instalada y así voy a lo seguro.
La opción "-a" es para que me diga en todos los sitios que pueden estar, por si hay más de uno de cada uno.

Buscará mame, mame32  y mame64. Mostrando la única salida:
Cita:/usr/games/mame

Debería ser un mensaje en parte para el área de Linux.

Oh, más de uno necesitamos hacer un curso de bash. Rolleyes

Saludos


RE: ¿ Cómo encontrar el comando de consola que necesito para mi aplicación ? - jguardon - 18-02-2021

Es que no me queda claro si estás hablando de Mame o de encontrar la ruta de un ejecutable.

Basta con usar which <ejecutable> para encontrarlo. Si no hay salida, es que no existe o no está instalado.

Saludos


RE: ¿ Cómo encontrar el comando de consola que necesito para mi aplicación ? - Shell - 18-02-2021

(18-02-2021, 16:00)jguardon escribió: Basta con usar which <ejecutable> para encontrarlo. Si no hay salida, es que no existe o no está instalado.

Hola Jesús.

En este caso no recordaba el comando which y se trataba de encontrar donde estaba instalado el emulador mame.
Me he encontrado un problema que no he podido resolver.

No sé hasta donde llega la potencia de la instrucción "Shell" o "Exec" en Gambas.
Por ejemplo, no me funciona en Gambas algo como esto.

El comodín llave y su manera de expandir, llevarlo a una instrucción creada en Gambas con Shell.

Código:
Shell "which mam{e,e32,e64}"

Que no obtengo salida.  Si lo logre haciendo que la instrucción Shell ejecute which con cada una de las posibiliaddes
hasta encontrar que alguna devuelva un valor.

Código:
Public Sub SimularWhich()
 
  Dim comandosposibles As String[] = ["mame", "mame32", "mame64"]
  Dim orden As String
  Dim salida As String
  Dim i As Integer  
 
  'Ejecutar una orden y si da salida no ejecutar ninguna más
  While IsNull(salida) And i <= comandosposibles.Max
    orden = "which " & comandosposibles[i]  
    Shell orden To salida
    i += 1
  Wend

  Print salida
 
End

Puede que haya ciertas limitaciones o no conozca la forma de hacerlo correctamente con la instrucción Shell de Gambas.

Saludos[/i]


RE: ¿ Cómo encontrar el comando de consola que necesito para mi aplicación ? - tincho - 19-02-2021

Tendrías que hacer así:
Código:
Public Sub Form_Open()

  Dim comandosposibles As String[] = ["gedit", "galculator"]
  Dim orden As String
  Dim salida As String
  Dim i As Integer

  'Ejecutar una orden y si da salida no ejecutar ninguna más
  While IsNull(salida) And i <= comandosposibles.Max
    orden = "which " & comandosposibles[i] & " 2>&1"
    Shell orden To salida
    Print salida
    i += 1
  Wend

  'Print salida

End
Saludos.[/i]


RE: ¿ Cómo encontrar el comando de consola que necesito para mi aplicación ? - Shell - 22-02-2021

Hola Tincho.

Con esa modificación obtendría la salida estándar y la de errores por la consola.

Realmente lo que intento y parece que Gambas no comprende. ( Lo entenderá a su manera ).
Es algo como esto:

Código:
Shell "which " & "mam{e,e32,e64}" & "2>&1" To cadena

La salida es nula. Hay una línea vacía solo.

Puede que la instrucción shell de Gambas no sea capaz de entender eso.
A lo mejor no sabe si son cadenas de texto, si son variables.
Desde luego las comillas delimitan lo que es .Un texto.

Y como funcionaba por eso lo de crear un bucle con las posibles opciones y ver cual tiene salida. Wink

Shell de Gambas no tiene por que tener toda la potencia del bash. Y como programadores de Gambas
siempre buscaremos la posibilidad de hacerlo en Gambas antes de hacer uso de comandos externos.

Saludos


RE: ¿ Cómo encontrar el comando de consola que necesito para mi aplicación ? - tincho - 22-02-2021

(22-02-2021, 17:43)Shell escribió: Shell "which " & "mam{e,e32,e64}" & "2>&1" To cadena

Te falta un espacio entre } y 2
Código:
Shell "which " & "mam{e,e32,e64}" & " 2>&1" To cadena
Saludos.


RE: ¿ Cómo encontrar el comando de consola que necesito para mi aplicación ? - Shell - 22-02-2021

(22-02-2021, 17:58)tincho escribió: Te falta un espacio entre } y 2

Efectivamente, pero  he logrado el mismo resultado. Huh

[Imagen: RXj4lNU.png]

Como ves no hay un cambio. Aunque es cierto que al principio estaba junto el } y el 2.
Aunque es un fallo muy típico lo solucioné nada más ver tu primera respuesta.

Saludos y muchas gracias por tu interés.Wink


RE: ¿ Cómo encontrar el comando de consola que necesito para mi aplicación ? - Shell - 24-02-2021

Hola!.

Parece que tengo que decirle al comando Shell de Gambas que "shell" del sistema quiero ejecutar. Por defecto es: "
Código:
/bin/sh

Así que:

Código:
Public Sub Ejemplo2()

  System.Shell = "/bin/bash"
 
  Shell "which " & "mam{e,e32,e64}" & " 2>&1"

End

Y entonces la salida será en este sistema:
Cita:/usr/games/mame

System.Shell

Saludos


RE: ¿ Cómo encontrar el comando de consola que necesito para mi aplicación ?. - jguardon - 24-02-2021

(24-02-2021, 01:20)Shell escribió: Parece que tengo que decirle al comando Shell de Gambas que "shell" del sistema quiero ejecutar. Por defecto es: "

Eso plantea el problema de que si distribuyes tu aplicación, no vas a saber qué shell tienen los diferentes usuarios. Entonces tu aplicación podría fallar si especificas un shell que no exista en esa máquina.

Se me ocurre que mediante alguna variable de entorno se puede averiguar y actuar en consecuencia, escogiendo entre varias opciones en el código. 

Imagina tener que averiguar entre:
  • Bourne shell (sh)
  • C shell (csh)
  • TC shell (tcsh)
  • Korn shell (ksh)
  • Bourne Again SHell (bash)

Pero es muy sencillo, sólo tienes que preguntar qué contiene la variable de entorno $SHELL

[code]

y la salida del comando te dirá qué shell se está ejecutando en tu sistema.


Saludos