Notepad++ NppExec: Redirigir al archivo usando '>' lo registra como argumento y no funciona, aunque funciona en la línea de comando

Notepad++ NppExec: Redirigir al archivo usando '>' lo registra como argumento y no funciona, aunque funciona en la línea de comando

Mirando el código a continuación, simplemente convierte un archivo ac o c++, por ejemplo, main.cppa su estado después del preprocesamiento, por ejemplo main_pp.cpp.

Sin embargo, ejecutar el comando que genera g++ -E "main.cpp" > "main_pp.cpp"funciona bien en la línea de comando.

El error exacto es g++: error: >: Invalid argument, por lo que aparentemente no ve que >no forma parte de la lista de argumentos.

cd "$(CURRENT_DIRECTORY)"
g++ -E "$(FILE_NAME)" > "$(NAME_PART)_pp$(EXT_PART)"

¿Alguien sabe por qué el comportamiento es diferente en NppExec en comparación con la línea de comando estándar?

Respuesta1

La redirección de salida >y la canalización |es algo de lo que es responsable el intérprete de línea de comando. En Windows, cmd.exees el intérprete de línea de comandos. Entonces, en lugar de

g++ -E "$(FILE_NAME)" > "$(NAME_PART)_pp$(EXT_PART)"

utilizar esta:

cmd /C g++ -E "$(FILE_NAME)" > "$(NAME_PART)_pp$(EXT_PART)"

Respuesta2

La respuesta corta es que el intérprete de línea de comando hace mucho más que solo ejecutar otros programas, y cosas como redirigir la salida de un programa usando >o canalizar la salida |son características proporcionadas por el intérprete de línea de comando, por lo que NppExec necesitaría simularlo en orden para trabajar.

Una respuesta más precisa es que normalmente inicias nuevos procesos en Windows usandoCreateProcess()y funciones relacionadas, y aunque puede redirigir la salida del nuevo proceso no es tan sencillo como usar >. Necesitasabrir una manijaal archivo y pasarlo en elSTARTUPINFOAusando las banderas apropiadas.

Entonces, para admitir >la redirección, NppExec necesitaría analizar la línea para separar esa parte de la aplicación y los parámetros, lo cual puede ser complicado, y también debería tener en cuenta que puede redirigir a otras cosas que no sean archivos como una impresora.

No es imposible, y parece que NppExec realiza un análisis básico porque en su ejemplo usa cdel que también proporciona el intérprete de línea de comando. Pero esto puede ser tan simple como simplemente verificar si los dos primeros caracteres que no sean espacios de una línea son "cd" y luego usar el resto de la línea para cambiar.el directorio actual.

También sospecho que NppExec ni siquiera analiza la línea para separar la aplicación de los parámetros. Creo que simplemente reemplaza las variables y aprovecha el hecho de que CreateProcess()permite omitir el parámetro de la aplicación, por lo que puede simplemente pasar la línea completa como parámetro de la línea de comando (al menos eso es lo que yo haría :-).

Finalmente, los programas que simplemente envían su resultado a la salida estándar esperando que lo redirija a un archivo o lo canalice a otro programa son más típicos en Unix/Linux (g++ parece ser parte de GNU que fue creado originalmente para Unix). En Windows es más común usar un parámetro para especificar el archivo de salida, por lo que admitir la redirección no es algo que usted considere una prioridad máxima (o incluso piense en ello) si no usa programas "estilo Linux".

información relacionada