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.

Los argumentos en C++ no son recibidos correctamente desde Bash.

Una versión de depuración de mi código C ++ comienza con:

int main(int argc, char *argv[])
{
     para (int i = 0; i & lt; argc; ++ i)
     {
         cout & lt; & lt; & quot; argv [& quot; & lt; & lt; i & lt; & lt; & quot;] = & quot; & lt; & lt; argv [i] & lt; & lt; endl;
     }
}

Cuando un cliente inicia este software desde Bash usando el comando:

../Merge-2021-11-22_0906_NOVEMBER_DEV9-Ubuntu20.04_x86_64/merge --autoXML merge_combine_command_small_testcase/input.xml -o autoxml -M "-F 0.3 -I -o mergeout "

aparece lo siguiente:

argv [0] = /mnt/raid/1_Merge_Kernel_testing/combined_command_testing/Merge-2021-11-22_0906_NOVEMBER_DEV9-Ubuntu20.04_x86_64/bin/merge
argv [1] = --autoXML
argv [2] = merge_combine_command_small_testcase/input.xml
argv [3] = -o
argv [4] = autoxml
argv [5] = -M
argv [6] = -F
argv [7] = 0.3
argv [8] = -I
argv [9] = -o
argv [10] = mergeout

… Lo cual no es correcto porque debido a las comillas dobles, argv [6] debería ser:

argv [6] = -F 0.3 -I -o mergeout

Esto es extraño porque solo sucede en el sistema del cliente mientras que Bash en mi computadora lo hace correctamente. Inicialmente pensé que el problema es que su shell no interpreta las comillas dobles. Pero escribí este script:

#!/bin/bash
echo param0: $ {0}
echo param1: $ {1}
echo param2: $ {2}
echo param3: $ {3}
echo param4: $ {4}
echo param5: $ {5}
echo param6: $ {6}
echo param7: $ {7}
echo param8: $ {8}
echo param9: $ {9}
echo param10: $ {10}
echo param11: $ {11}
echo param12: $ {12}

y muestra los parámetros correctamente en su sistema y en el mío. Ahora no sé cómo depurar esto más. ¿Alguna idea de qué puede causar el comportamiento diferente?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Posibles causas de un comportamiento diferente en el código C++ y el script Bash

    Pueden haber varias razones por las cuales el código C++ y el script Bash presentan un comportamiento diferente para el mismo comando de entrada. Algunas de ellas se enumeran a continuación:

    1. Diferentes entornos de shell: El comportamiento del shell depende de las variables de entorno y configuraciones. Es posible que el sistema del cliente tenga un entorno de shell diferente en comparación con el de su computadora. Para verificar esto, puede verificar las variables de entorno y configuraciones en ambos sistemas.
    2. Análisis de los argumentos de línea de comando: El código C++ y el script Bash analizan los argumentos de línea de comando de manera diferente. Mientras que el script Bash utiliza una separación simple con espacios en blanco para dividir los argumentos, el código C++ utiliza un mecanismo de análisis más complejo. Es posible que el código C++ no pueda manejar correctamente los argumentos entre comillas dobles en el sistema del cliente debido a alguna configuración o error específico del sistema.

    3. Problemas de codificación de entrada: Otra posible causa del comportamiento diferente podría estar relacionada con la codificación de entrada. Es posible que el comando de entrada contenga algunos caracteres que no estén codificados correctamente en el sistema del cliente, causando que el análisis falle.

    Posibles soluciones para depurar el problema

    Para depurar aún más el problema, puede intentar lo siguiente:

    1. Imprima información de depuración: puede agregar más información de depuración al código C++ para ver dónde falla el análisis. Por ejemplo, puede imprimir los caracteres individuales de cada argumento para ver si hay problemas de codificación.

    2. Intente con un shell diferente: puede pedirle al cliente que intente con un shell diferente, como Zsh o fish, para ver si el comportamiento es consistente en diferentes shells. Esto puede ayudar a reducir el problema a un entorno de shell específico.

    3. Use una biblioteca de análisis diferente: si el problema está relacionado con el mecanismo de análisis utilizado en el código C++, puede intentar usar una biblioteca de análisis diferente que sea más robusta y pueda manejar correctamente los argumentos entre comillas dobles.

    4. Actualice los paquetes del sistema: es posible que el sistema del cliente tenga un paquete obsoleto o con errores que esté causando el problema. Puede verificar si hay actualizaciones disponibles para los paquetes del sistema y recomendar al cliente que los actualice.

    5. Compare las variables de entorno y configuraciones: puede comparar las variables de entorno y configuraciones en ambos sistemas para ver si hay diferencias que puedan estar causando el problema. Esto puede ayudar a identificar la configuración específica que está causando el problema.

Comments are closed.