7 votes

Comment exécuter le shell script avec C# sous OSX ?

J'aimerais utiliser C# pour exécuter un shell script. Sur la base de questions similaires, je suis arrivé à une solution qui ressemble à ceci.

System.Diagnostics.Process.Start("/Applications/Utilities/Terminal.app","sunflow/sunflow.sh");

Il ouvre actuellement Terminal, puis ouvre le fichier shell avec l'application par défaut (Xcode dans mon cas). Changer l'application par défaut n'est pas une option, puisque cette application devra être installée pour les autres utilisateurs.

Idéalement, la solution permettra d'utiliser des arguments pour le fichier shell.

10voto

Adam Mihalcin Points 8816

Je ne peux pas faire de test avec un Mac pour l'instant, mais le code suivant fonctionne sous Linux et devrait fonctionner sur un Mac car Mono est assez proche des interfaces .NET de Microsoft :

ProcessStartInfo startInfo = new ProcessStartInfo()
{
    FileName = "foo/bar.sh",
    Arguments = "arg1 arg2 arg3",
};
Process proc = new Process()
{
    StartInfo = startInfo,
};
proc.Start();

Quelques notes sur mon environnement :

  • J'ai créé un répertoire de test spécifiquement pour revérifier ce code.

  • J'ai créé un fichier bar.sh dans le sous-répertoire foo, avec le code suivant :

    #!/bin/sh
    for arg in $*
    do
        echo $arg
    done
  • J'ai emballé un Main autour du code C# ci-dessus dans Test.cs, et compilé avec la méthode dmcs Test.cs et exécuté avec mono Test.exe .

  • La sortie finale est "arg1 arg2 arg3", avec les trois jetons séparés par des retours à la ligne.

3voto

user790049 Points 943

Merci Adam, c'est un bon point de départ pour moi. Cependant, pour une raison quelconque, lorsque j'ai essayé le code ci-dessus (modifié selon mes besoins), j'ai obtenu l'erreur suivante

System.ComponentModel.Win32Exception: Exec format error

voir le code ci-dessous qui donne l'erreur ci-dessus

ProcessStartInfo startInfo = new ProcessStartInfo()
               {
                       FileName = "/Users/devpc/mytest.sh",
                       Arguments = string.Format("{0} {1} {2} {3} {4}",  "testarg1", "testarg2", "testarg3", "testarg3", "testarg4"),
                       UseShellExecute = false,
                       RedirectStandardOutput = true,
                       CreateNoWindow = true
                   };
                  Process proc = new Process()
                  {
                    StartInfo = startInfo,
                  };
                   proc.Start();
                   while (!proc.StandardOutput.EndOfStream)
                   {
                       string result = proc.StandardOutput.ReadLine();
                       //do something here
                   }

J'ai passé un peu de temps et j'ai trouvé la solution ci-dessous, qui fonctionne dans mon cas - juste au cas où quelqu'un rencontrerait cette erreur, essayez ci-dessous.

Solution de travail :

  var command = "sh";
    var scriptFile = "/Users/devpc/mytest.sh";//Path to shell script file
    var arguments = string.Format("{0} {1} {2} {3} {4}",  "testarg1", "testarg2", "testarg3", "testarg3", "testarg4");
    var processInfo = new ProcessStartInfo()
    {
        FileName = command,
        Arguments = arguments,
        UseShellExecute = false,
        RedirectStandardOutput = true,
        CreateNoWindow = true

    };

    Process process = Process.Start(processInfo);   // Start that process.
    while (!process.StandardOutput.EndOfStream)
    {
        string result = process.StandardOutput.ReadLine();
        // do something here
    }
    process.WaitForExit();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X