Este foro usa cookies
Este foro utiliza cookies para almacenar su información de inicio de sesión si está registrado y su última visita si no lo está. Las cookies son pequeños documentos de texto almacenados en su computadora; las cookies establecidas por este foro solo se pueden usar en este sitio web y no representan ningún riesgo de seguridad. Las cookies en este foro también rastrean los temas específicos que ha leído y la última vez que los leyó. Si Ud. continúa navegando, entenderemos que acepta todas las cookies.

Se almacenará una cookie en su navegador, independientemente de la elección, para evitar que se le vuelva a hacer esta pregunta. Podrá cambiar la configuración de sus cookies en cualquier momento utilizando el enlace en el pie de página.

El foro antiguo se encuentra accesible desde https://foro.gambas-es.org en modo de solo lectura.

Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5

[SOLUCIONADO]  ¿ Cómo encontrar el comando de consola que necesito para mi aplicación ?.
#1

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

“Nunca confíes en un ordenador que no puedas lanzar por la ventana” – Steve Wosniak
#2

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

“Nunca confíes en un ordenador que no puedas lanzar por la ventana” – Steve Wosniak
#3

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

Por favor, usa el corrector ortográfico antes de pulsar el botón 'Enviar'
#4

(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]

“Nunca confíes en un ordenador que no puedas lanzar por la ventana” – Steve Wosniak
#5

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]
#6

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

“Nunca confíes en un ordenador que no puedas lanzar por la ventana” – Steve Wosniak
#7

(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.
#8

(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

“Nunca confíes en un ordenador que no puedas lanzar por la ventana” – Steve Wosniak
#9

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

“Nunca confíes en un ordenador que no puedas lanzar por la ventana” – Steve Wosniak
#10

(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

Bash
  1. echo $SHELL



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


Saludos

Por favor, usa el corrector ortográfico antes de pulsar el botón 'Enviar'


Posibles temas similares…
Tema / Autor Respuestas Vistas Último mensaje

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)