2014-07-23 17 views
5

Sto usando il seguente codice per eseguire un comando console Linux tramite Mono in un'applicazione C#:Esecuzione di un comando Console Linux in 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(); 

Questo funziona come previsto. Ma, se do il comando come "-c ls -l" o "-c ls /path", ottengo ancora l'output con -l e path ignorato.

Quale sintassi dovrei usare per utilizzare più commutatori per un comando?

+2

Si potrebbe provare a utilizzare 'ProcessStartInfo.Arguments' per vedere se il metodo alternativo funziona? Hai anche bisogno di/bin/bash? non puoi semplicemente eseguire 'ls' direttamente? – cjb110

+0

@ cjb110 no, non funziona. Sì, devi impostare/bin/bash come nome file oppure non trovare l'eseguibile bash da solo. – ravindu1024

+0

Forse prova RedirectStandardInput e invia i comandi. Non conosco il codice esatto, ma so che puoi farlo per inviare input al processo. Ecco un esempio: http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardinput(v=vs.110).aspx – NewfrontSolutions

risposta

2

Hai dimenticato a il preventivo il comando.

Hai provato quanto segue sul prompt di bash?

bash -c ls -l 

vi consiglio caldamente di leggere il man bash. E anche il manuale getopt in quanto è ciò che bash usa per analizzare i suoi parametri.

Ha esattamente lo stesso comportamento di bash -c ls Perché? Perché devi dire a bash che ls -l è l'argomento completo di -c, altrimenti -l viene trattato come un argomento di bash. O bash -c 'ls -l' o bash -c "ls -l" farà quello che ti aspetti. È necessario aggiungere le citazioni come questa:

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

bash -c 'ls -l' è quasi lo stesso di bash -c "ls -l" ma non richiede l'escape nella stringa C# – user1709408

Problemi correlati