tôi cần sử dụng bash shell "bên trong" chương trình C#. Tôi muốn bắt chước gõ người dùng ở chế độ tương tác và chạy lệnh Cygwin.Sử dụng bash (cygwin) bên trong chương trình C#
tôi đã tạo một quy trình chạy bash và chuyển hướng stdin, lỗi stout và std nhưng tôi không thể làm việc được đính kèm là mã mẫu bắt đầu quá trình bash và chuyển hướng đầu vào/đầu ra.
vấn đề là tôi không có thiết bị tty. nếu tôi cố gắng chạy lệnh tty hoặc lệnh stty tôi nhận được phản ứng lỗi
tty - not a tty
stty - Inappropriate ioctl for device
tôi nghĩ rằng điều này là do từ psi.UseShellExecute = false;
tôi cần phải chạy Cygwin và vô hiệu hóa tiếng vang với stty -echo nhưng để làm i này cần một thiết bị tty. làm thế nào ca tôi tạo ra một vỏ bash Cygwin với thiết bị tty và chuyển hướng các stdin, ra và lỗi?
1) những gì còn thiếu?
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
namespace shartCygwin
{
class Program
{
private static Queue<string> ResponseQueue = null;
private static ManualResetEvent ResponseEvent = null;
static void Main(string[] args)
{
ResponseQueue = new Queue<string>();
ResponseEvent = new ManualResetEvent(false);
Process bashProcess = new Process();
bashProcess.StartInfo.FileName = "C:\\cygwin\\bin\\bash.exe";
bashProcess.StartInfo.Arguments = "--login -i ";
bashProcess.StartInfo.WorkingDirectory = "C:\\cygwin\\bin";
bashProcess.StartInfo.EnvironmentVariables["CYGWIN"] = "tty";
bashProcess.StartInfo.RedirectStandardError = true;
bashProcess.StartInfo.RedirectStandardInput = true;
bashProcess.StartInfo.RedirectStandardOutput = true;
bashProcess.StartInfo.CreateNoWindow = true;
bashProcess.StartInfo.UseShellExecute = false;
bashProcess.StartInfo.ErrorDialog = false;
bashProcess.Start();
DataReceivedEventHandler errorEventHandler = new DataReceivedEventHandler(ErrorDataReceived);
DataReceivedEventHandler outEventHandler = new DataReceivedEventHandler(OutDataReceived);
bashProcess.OutputDataReceived += outEventHandler;
bashProcess.ErrorDataReceived += errorEventHandler;
bashProcess.BeginErrorReadLine();
bashProcess.BeginOutputReadLine();
while(true)
{
Thread.Sleep(1000);
}
}
static void ErrorDataReceived(object sender, DataReceivedEventArgs dataReceivedEventArgs)
{
try
{
lock (ResponseQueue)
{
Console.WriteLine(dataReceivedEventArgs.Data);
ResponseQueue.Enqueue(dataReceivedEventArgs.Data);
ResponseEvent.Set();
}
}
catch (Exception e)
{
Console.WriteLine(e.Data);
}
}
static void OutDataReceived(object sender, DataReceivedEventArgs dataReceivedEventArgs)
{
try
{
lock (ResponseQueue)
{
Console.WriteLine(dataReceivedEventArgs.Data);
ResponseQueue.Enqueue(dataReceivedEventArgs.Data);
ResponseEvent.Set();
}
}
catch (Exception e)
{
Console.WriteLine(e.Data);
}
}
}
}
Tôi đã chạy chương trình của bạn và mặc dù tôi thấy lỗi "ioctl cho thiết bị không phù hợp", tôi cũng thấy dấu nhắc bash Cygwin sau đó. Chính xác thì vấn đề là gì? Tôi đã loại bỏ đường CYGWIN = tty và tôi thấy rằng đầu ra te là thô, với các mã điều khiển được hiển thị. –
@Hemlock - Tôi nghĩ chìa khóa ở đây, dựa trên câu trả lời của Kevin Mark, là bạn có thể quyết định có sử dụng tiếng vọng hay không, vì vậy nó có thực sự quan trọng nếu bạn tắt tiếng/etc ... Và động lực là gì để cố lừa CYGWIN vào việc sử dụng TTY? – Peter