2014-07-23 9 views
5

Używam poniższy kod, żeby uruchomić polecenie Linux konsoli poprzez Mono w aplikacji C#:uruchamiając komendę konsoli Linuksa w C#

ProcessStartInfo procStartInfo = new ProcessStartInfo("/bin/bash", "-c ls"); 
procStartInfo.RedirectStandardOutput = true; 
procStartInfo.UseShellExecute = false; 
procStartInfo.CreateNoWindow = true; 

System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
proc.StartInfo = procStartInfo; 
proc.Start(); 

String result = proc.StandardOutput.ReadToEnd(); 

To działa zgodnie z oczekiwaniami. Ale jeśli wydam polecenie jako "-c ls -l" lub "-c ls /path" nadal otrzymuję dane wyjściowe z ignorowanymi -l i path.

Jakiej składni należy użyć przy użyciu wielu przełączników dla polecenia?

+2

Można spróbować użyć 'ProcessStartInfo.Arguments' aby sprawdzić, czy alternatywna metoda działa? Czy potrzebujesz także/bin/bash? czy nie możesz po prostu uruchamiać "ls" bezpośrednio? – cjb110

+0

@ cjb110 nie, to nie działa. Tak, musisz ustawić/bin/bash jako nazwę pliku lub nie może on sam znaleźć pliku wykonywalnego bash. – ravindu1024

+0

Może wypróbuj RedirectStandardInput i wyślij polecenia. Nie znam dokładnego kodu, ale wiem, że możesz to zrobić, aby wysłać dane wejściowe do procesu. Oto przykład: http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardinput(v=vs.110).aspx – NewfrontSolutions

Odpowiedz

2

Zapomniałeś cytować polecenia.

Czy w wierszu polecenia bash wypróbowano następujące czynności?

bash -c ls -l 

Sugeruję, aby przeczytać man bash. A także instrukcja getopt, ponieważ to jest to, czego używa bash do analizy parametrów.

Ma dokładnie to samo zachowanie, co bash -c ls Dlaczego? Ponieważ musisz powiedzieć bashowi, że ls -l jest pełnym argumentem -c, w przeciwnym razie -l jest traktowany jak argument basha. Albo bash -c 'ls -l' lub bash -c "ls -l" zrobi to, czego oczekujesz. Trzeba dodać cytaty tak:

ProcessStartInfo procStartInfo = new ProcessStartInfo("/bin/bash", "-c 'ls -l'"); 
+1

bash -c 'ls -l' jest prawie taki sam jak bash -c "ls -l", ale nie wymaga ucieczki w łańcuchu C# – user1709408