<div dir="ltr"><div><div><div><div><div><div>I'm attempting to fix <a href="https://bugzilla.xamarin.com/show_bug.cgi?id=12552">https://bugzilla.xamarin.com/show_bug.cgi?id=12552</a> and <a href="https://bugzilla.xamarin.com/show_bug.cgi?id=12551">https://bugzilla.xamarin.com/show_bug.cgi?id=12551</a>. Console, ConsoleDriver, and the IConsoleDriver implementations make the flawed assumption that "is console" is a simple boolean value when standard input or standard output can be redirected to a file or a pipeline independently of each other.<br>
<br></div>I got rid of NullConsoleDriver and made WindowsConsoleDriver do the right thing depending on whether or not standard input or standard output is a console. This was straightforward; For example, WindowsConsoleDriver.KeyAvailable does the usual if standard input is a console, if not it returns false (which should throw an exception instead as per <a href="http://msdn.microsoft.com/en-us/library/system.console.keyavailable.aspx">http://msdn.microsoft.com/en-us/library/system.console.keyavailable.aspx</a> but that's for another commit...).<br>
<br></div>I am running into some trouble doing the same with TermInfoDriver. It looks like mono disables the normal echoing of console input characters to the console and handles that logic itself, echoing input characters to standard output, instead letting the terminal take care of it. This is quite problematic if standard output is redirected but standard input is not.<br>
<br></div>Why does this matter? Here's one use case. A program wants to read in a password from the user. If standard input is a console, the program uses ReadKey(true) to read the password without displaying it on the screen. Consider what happens if the user wants to run output through tee. What should happen is that everything is the same except that any output the program itself outputted should go to the file specified to tee. For example:<br>
<br>greg@Kubuntu:~$ echo "abc" > test.txt<br>greg@Kubuntu:~$ sudo cat test.txt | tee sudo_output.txt<br>[sudo] password for greg:<br>abc<br><br></div>As another example<br><br>greg@Kubuntu:~$ cat - > test_cat_output.txt<br>
<br></div>Even though standard output is redirected to a file, standard input is still echoed to the console.<br><br>Taking over the job of echoing input characters instead of letting the terminal handle it strikes me as an odd design. What's the reason for this approach? Is there a solution to the problem of allowing one of input/output to be redirected and letting the one using the console to still function correctly that does not involve rewriting large parts of TermInfoDriver and associated internal calls?<br>
<br></div>- Greg<br></div>