J'ai un programme GUI C++ qui prend une commande shell de l'utilisateur, appelle forkpty() et execvp() pour exécuter cette commande dans un processus fils, tandis que le processus parent (GUI) lit stdout/stderr du processus fils sortie et l'affiche dans l'interface graphique.Comment faire pour forkpty/execvp() pour gérer correctement la redirection et les autres bash-ismes?
Tout cela fonctionne bien (sous Linux et MacOS/X). Par exemple, si l'utilisateur entre "ls -l/foo", l'interface graphique affichera le contenu du dossier/foo.
Cependant, les subtilités de bash comme la redirection de sortie ne sont pas gérées. Par exemple, si l'utilisateur entre "echo bar> /foo/bar.txt", le processus enfant affichera le texte "bar> /foo/bar.txt", au lieu d'écrire le texte "bar" dans le fichier "/ foo/bar.txt ". Vraisemblablement parce que execvp() exécute la commande exécutable "echo" directement, au lieu d'exécuter/bin/bash et de lui passer la commande de massage/pré-traitement de l'utilisateur.
Ma question est, quelle est l'invocation correcte du processus fils à utiliser, afin que le système se comporte exactement comme si l'utilisateur avait tapé sa chaîne à l'invite bash? J'ai essayé d'encapsuler la commande de l'utilisateur avec une invocation/bin/bash, comme ceci:/bin/bash -c the_string_the_user_entered, mais cela ne semblait pas fonctionner. Des indices?
ps système Just appelant() n'est pas une bonne option, car il causerait mon interface graphique pour bloquer jusqu'à ce que le processus se termine des enfants, et certains processus enfants ne peuvent pas sortir pendant longtemps (si jamais!)