es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El comando “echo” devuelve “Línea de comando no válida” cuando se ejecuta desde “execute_command_line”.

Estoy en Windows con Cygwin con gcc 11.2.0, y mi problema se reduce a este código Fortran:

program test
implicit none
integer :: stat, ext
character(len=30) :: err = ''
call execute_command_line("echo ab",cmdstat=stat,exitstat=ext,cmdmsg=err)
print*, 'cmdstat = ',stat
print*, 'exitstat = ',ext
print*, 'cmdmsg = ',err
end program test

Lo construyo simplemente con gfortran -o run file.f95, y luego lo ejecuto desde la línea de comandos. Cuando lo ejecuto desde la Terminal de Cygwin, funciona como esperaba:

$ ./run.exe
ab
cmdstat = 0
exitstat = 0
cmdmsg =

(es decir: se imprime “ab”, el estado de salida es cero y el mensaje de retorno está en blanco).

Sin embargo, cuando ejecuto el mismo ejecutable desde CMD o PowerShell, da como resultado:

D:\test>run.exe
cmdstat = 3
exitstat = 127
cmdmsg = Invalid command line

que parece ser un error del shell(?) diciendo “Línea de comando inválida”.

Lo que me desconcierta no es el hecho de que no funcione (es Windows, después de todo :). Lo que realmente me intriga es que si ejecuto (lo que creo que es) exactamente el mismo comando manualmente:

D:\test>echo ab
ab

funciona.

Supongo que el shell utilizado por execute_command_line para ejecutar la línea de comando no es el mismo que el que estoy usando a mano (aunque la documentación dice que se ejecuta en cmd.exe, lo cual agrega a mi confusión). ¿Qué está pasando?

Reduciendo el problema a:

program test
call execute_command_line('echo x')
end program test

compilándolo con gfortran -o run test.f95 y luego ejecutándolo en la terminal Cygwin:

$ ./run.exe
x

y en CMD:

D:\test>run.exe
Fortran runtime error: EXECUTE_COMMAND_LINE: Invalid command line

Error termination. Backtrace:
0x3ffa9569a
0x3ffa23cd4
0x3ff9e40f3
0x3ffaac704
0x3ff9488ae
0x1004010c2
0x100401105
0x180049b8c
0x180047745
0x1800477f3
0xffffffffffffffff

Este programa en C muestra el mismo problema:

#include <stdio.h>
#include <stdlib.h>

int main()
{
  int s = system("echo x");
  printf("%d\n",s);
  return 0;
}

Ejecutarlo en la terminal de Cygwin imprime x 0, y ejecutarlo en CMD imprime solo el estado de salida 127, por lo que parece ser algo con cómo el compilador está construyendo las partes dependientes del sistema del código.

Solo por diversión, intenté instalar MinGW y compilar el programa con eso en su lugar, y funciona perfectamente en ambos casos. Viene con GCC 6.3.0, por lo que no sé si es un problema con la versión más nueva de GCC o si es culpa de Cygwin.

Mi problema se resuelve usando el GCC de MinGW en su lugar, pero dejaré esto aquí en caso de que alguien en el futuro tenga una respuesta. Muchas gracias a todos los que ayudaron!</stdlib.h></stdio.h>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema en cuestión es que un programa Fortran que utiliza execute_command_line para ejecutar comandos de shell se comporta de manera diferente en la Terminal de Cygwin en comparación con su ejecución en CMD o PowerShell en Windows. Al ejecutarse desde CMD, se genera un error que dice “Línea de comando no válida”, incluso si al introducir manualmente el mismo comando produce la salida esperada.

    Se hipotetiza que el problema podría ser causado por una diferencia en el shell utilizado por el programa Fortran y el utilizado por el usuario. La documentación indica que execute_command_line utiliza cmd.exe, pero esto puede no ser así.

    Se ofrece también un programa en C que muestra el mismo problema, y se destaca que el problema se resuelve al utilizar GCC de MinGW en lugar de la versión de Cygwin. No se sabe con certeza si el problema es causado por Cygwin o por la versión más reciente de GCC que utiliza Cygwin.

Comments are closed.