2017-04-20 3 views
0

J'ai démarré bash (cygwin) à partir de C# et j'ai créé un nouveau processus à partir de C:\\cygwin64\\bin\\bash.exe avec les arguments --login -i. J'ai également redirigé sa sortie.Le processus bash démarré à partir de C# renvoie des caractères inattendus

Bash fonctionne, mais la sortie contient des caractères inattendus comme [0m[37;1m ou [0m> ou [K> ou même > (il y a un caractère ESC avant tout cela, mais stackoverflow ne semble pas que ce soit affiché). C'est une cause inattendue car je ne vois aucun de ces personnages du programme mintty.

Pourquoi cela se produit-il? D'où viennent ces personnages? Comment puis-je les empêcher d'apparaître?

Répondre

0

Les caractères inattendus sont des séquences d'échappement utilisées pour formater la sortie de texte (concernant l'émulateur de terminal). (Voir Wikipedia: terminal emulator pour plus à ce sujet.)

En détail, la sortie de l'invite peut être configurée en utilisant certaines variables bash, à savoir PS1, PS2, PS3, PS4. Dans How to change bash prompt color based on exit code of last command?, l'effet de les modifier (juste pour le plaisir) est montré.

Dans votre cas, l'appel de bash doit générer un script spécial qui les redéfinit simplement sans séquence d'échappement. Ainsi, vous pouvez vous débarrasser de la mise en forme indésirable. Cela peut aider: SO: Running a custom profile file on remote host mais cela semble également prometteur: Is it possible to start a bash shell with a profile at a custom location, in a one liner command?.

En écrivant ceci, je me suis souvenu que certaines commandes (par exemple ls) supportent également la sortie colorée. Comme je ne suis pas sûr que j'essayé ceci:

$ mkdir test ; cd test ; touch test1 ; ln -s test1 test2 ; mkdir test3 ; touch test4 ; chmod a+x test4 

$ ls --color 
test1 test2 test3 test4 

$ 

Je ne sais pas comment le formater avec des couleurs ici mais, sur mon xterm, il cherche comme Mardi Gras. Ainsi, j'utilise hexdump pour montrer l'effet:

$ ls --color | hexdump -c 
0000000 t e s t 1 \n 033 [ 0 m 033 [ 0 1 ; 3 
0000010 6 m t e s t 2 033 [ 0 m \n 033 [ 0 1 
0000020 ; 3 4 m t e s t 3 033 [ 0 m \n 033 [ 
0000030 0 1 ; 3 2 m t e s t 4 033 [ 0 m \n 
0000040 

Comme vous pouvez le voir: ls n'utilise des séquences d'échappement terminales aussi. Ensuite, je me suis souvenu de la variable TERM. Ce lien The TERM variable mentionne les terminfo ou termcap également qui font probablement partie du jeu.

Ainsi, en plus de la re-définition PS1 ... PS4, il pourrait être utile de redéfinir TERM aussi:

$ TERM= 

$ ls --color | hexdump -c 
0000000 t e s t 1 \n t e s t 2 \n t e s t 
0000010 3 \n t e s t 4 \n         
0000018 

$ 

btw. J'ai reconnu que l'invite bash est toujours colorée. Penser deux fois ceci devient évident: les séquences d'échappement dans PS1 ... PS4 sont "codées en dur" c'est-à-dire ne considèrent pas le réglage de TERM.

Mise à jour:

Pour tester ce que j'ai écrit un exemple de script mybashrc:

PS1="> " 
PS2=">>" 
PS3= 
PS4="++ " 
TERM= 

et testé avec bash Cygwin sur Windows 10 (64 bits):

$ bash --init-file mybashrc -i 
> echo "$PS1 $PS2 $PS3 $PS4" 
> >> ++ 
> exit 
exit 

$ 

Btw.J'ai remarqué que la touche [Backspace] fonctionne d'une manière ou d'une autre étrange dans ma session exemple: elle a toujours l'effet voulu mais la sortie est fausse. La sortie est au lieu de supprimer le dernier caractère, bien que la mémoire tampon interne semble gérer cela correctement:

$ bash --init-file mybashrc -i 
> echo "Ha ello" 
Hello 
> echo "Ha ello" | hexdump -c 
0000000 H e l l o \n 
0000006 
> exit 
exit 

$ 

(Dans les deux cas, je dactylographiées [Backspace] une fois après echo "Ha.) La raison est peut-être l'émulation de terminal manquant.

Ainsi, je crois que si la console (dans votre application) gère correctement les backspaces dans le canal de sortie du bash, cela devrait être moins déroutant.

+0

Existe-t-il une commande, un argument ou un paramètre pour indiquer au programme 'bash.exe' d'empêcher l'ajout de ces codes de séquence d'échappement et de couleur? – newpeople

+0

Je viens de lire le 'man bash' concernant l'effet des arguments' -i' et '--login' (et les autres) parce que j'avais l'idée que ceux-ci pourraient aussi être liés à votre problème. Si j'ai bien compris, ces arguments définissent principalement quels scripts sont exécutés au démarrage et à la sortie de bash. Cela me permet de croire qu'il n'y a pas de support de couleur intégré. Chaque mise en forme est effectuée par configuration. Ainsi, les conseils ci-dessus devraient être suffisants. – Scheff

+0

Ainsi, la solution est probablement de démarrer votre bash avec (argument supplémentaire) '--init-file' ou' --rcfile' et un script qui redéfinit les variables mentionnées 'PS1' ... 'PS4' et' TERME ». – Scheff