Comunidad Gambas-es

Versión completa: ¿ Cómo encontrar el comando de consola que necesito para mi aplicación ?. SOLUCIONADO
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
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é.

GAMBAS
  1. 'Funciona con mame para una distro de 32 bits
  2.   'lineacomando = "mame32 " & "-listclones " & Chr$(34) & TextBoxClones.Text & Chr$(34)
  3.  
  4.   'Funciona con mame para una distro de 64 bits
  5.   'lineacomando = "mame64 " & "-listclones " & Chr$(34) & TextBoxClones.Text & Chr$(34)
  6.  
  7.   'Funciona con mame para una distro de 64 bits de Linux Mint 20.X
  8.   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.
Bash
  1. 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
Comencemos con.  ¿ Qué es ?...

Bash
  1. 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 ?

Bash
  1. which -a mam{e,e32,e64}



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

Bash
  1. 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
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
(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.

Bash
  1. 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.

GAMBAS
  1. Public Sub SimularWhich()
  2.  
  3.   Dim comandosposibles As String[] = ["mame", "mame32", "mame64"]
  4.   Dim orden As String
  5.   Dim salida As String
  6.   Dim i As Integer  
  7.  
  8.   'Ejecutar una orden y si da salida no ejecutar ninguna más
  9.   While IsNull(salida) And i <= comandosposibles.Max
  10.     orden = "which " & comandosposibles[i]  
  11.     Shell orden To salida
  12.     i += 1
  13.   Wend
  14.  
  15.   Print salida
  16.  



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

Saludos[/i]
Tendrías que hacer así:
GAMBAS
  1. Public Sub Form_Open()
  2.  
  3.   Dim comandosposibles As String[] = ["gedit", "galculator"]
  4.   Dim orden As String
  5.   Dim salida As String
  6.  
  7.   'Ejecutar una orden y si da salida no ejecutar ninguna más
  8.   While IsNull(salida) And i <= comandosposibles.Max
  9.     orden = "which " & comandosposibles[i] & " 2>&1"
  10.     Shell orden To salida
  11.     Print salida
  12.     i += 1
  13.   Wend
  14.  
  15.   'Print salida
  16.  


Saludos.[/i]
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:

GAMBAS
  1. 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
(22-02-2021, 17:43)Shell escribió: [ -> ]Shell "which " & "mam{e,e32,e64}" & "2>&1" To cadena

Te falta un espacio entre } y 2
Bash
  1. Shell "which " & "mam{e,e32,e64}" & " 2>&1" To cadena


Saludos.
(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
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:

GAMBAS
  1. Public Sub Ejemplo2()
  2.  
  3.   System.Shell = "/bin/bash"
  4.  
  5.   Shell "which " & "mam{e,e32,e64}" & " 2>&1"
  6.  



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

System.Shell

Saludos