用C#运行Bash命令

7
我正在尝试从运行于IIS 7/.Net 4.5的C#中运行bash命令。在网上搜索了很多答案,但大部分都假定你已经安装/准备好了某些内容。我已经安装了"Git 1.9.4.msysgit.2"和Git Bash以及Git Gui。我需要帮助了解还需要安装什么才能运行最简单的bash命令,并且如何运行它。我看过像bash pipes - I am trying to call script from c#这样的文章,但那使用了"cygwin"。如果没有它,我能否做到同样的事情,如果可以,我该怎么做?

目标

如果我上面提出的问题不太清楚或似乎是在问不同的问题,这是我的最终目标。我正在尝试编写自己的服务器端git挂钩。当开发人员将他们的提交推送到我们的GitHub存储库时,我希望GitHub调用我们的回调URL。我希望我的回调URL运行一个git pull命令,以使用刚刚推送的内容更新我们的staging服务器。
我基于我之前在GitHub - setup auto deployment with remote server上提出的问题得出了这个问题。根据那里的答案,我正在尝试运行一个简单的命令,可以通过硬编码命令或将其放入脚本并运行来完成,例如:cd $REPO_DIR && git pull origin $branch_name
我知道Jenkins和其他软件,但我想自己执行这些命令而不是安装另一个软件。
如果需要进一步的信息,请随时提问。
更新1
因此,基于下面的几个答案,我想出了以下解决方案。
using System.Diagnostics;

Process process = new Process();

ProcessStartInfo processStartInfo = new ProcessStartInfo();
processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
processStartInfo.FileName = @"C:\Program Files (x86)\Git\bin\bash.exe";
processStartInfo.WorkingDirectory = @"C:\myrepo\mysite";
processStartInfo.Arguments = "git status";
processStartInfo.RedirectStandardOutput = true;
processStartInfo.RedirectStandardError = true;
processStartInfo.UseShellExecute = false;

process.StartInfo = processStartInfo;
process.Start();

String error = process.StandardError.ReadToEnd();
String output = process.StandardOutput.ReadToEnd();

ViewBag.Error = error;
ViewBag.Ouput = output;

使用上面的代码,我得到了"C:/Program Files (x86)/Git/bin/bash.exe": git: No such file or directory。我知道exe文件在那里,我做错了什么?
更新2
根据@SurgeonofDeath的评论,我遵循了这篇文章http://blog.countableset.ch/2012/06/07/adding-git-to-windows-7-path/并将Git的路径添加到我的环境变量中。然而,我仍然遇到相同的问题。有什么建议吗?
谢谢。

只是为了明确,当你说“bash”时,你是指命令行程序吗?还是你实际上想要调用Unix bash shell? - lukevp
我想更好的问题是,如果您不能全局安装MS Git,那么它是否可以从普通命令行中调用?在这种情况下,您可以使用普通调用命令行程序,而不必处理MS Git默认安装的bash shell。 - lukevp
@SurgeonofDeath 谢谢!已经接近我需要的了。如果 Git 不在我的环境变量中,我该怎么办?我正在更新我的答案,包括我已经完成的工作。 - RoLYroLLs
@SurgeonofDeath,谢谢你!如果我不能在不添加环境变量的情况下使其正常工作,那将是最后的选择。 - RoLYroLLs
@SurgeonofDeath 谢谢,我已经添加了! - RoLYroLLs
显示剩余7条评论
3个回答

2

不要调用bash.exe,只需调用git并将状态作为参数传递:

processStartInfo.FileName = "git";
processStartInfo.Arguments = "status";

0
也许我误解了你的问题,但是关于 execve 怎么样呢? 这里是它的 man 手册摘录。

NAME

   execve - execute program

SYNOPSIS

   #include <unistd.h>

   int execve(const char *filename, char *const argv[],
              char *const envp[]);

DESCRIPTION

   execve() executes the program pointed to by filename.  filename must > be
   either a binary executable, or a script starting with  a  line  of  > the
   form:

       #! interpreter [optional-arg]

我不确定为什么这被发布为答案,我认为这应该是一个评论,因为它是一个问题? - Hozikimaru
你可以使用execve从C中运行命令或脚本。这个问题只是因为我担心Git的事情。请让@RoLYrolls在这里留下评论,以查看我是否完全错误(这就是为什么它被设计成一个问题的原因:) - Marc Bredt
@EmilKakkau 谢谢你的回答。这段代码可以从C#运行吗?在我看来它很像PHP(但我可能错了)。谢谢! - RoLYroLLs
@RoLYroLLs 这看起来非常像 C 语言。这也是我不确定这是否能成为问题的答案的另一个原因。标签指向 C 语言,我认为可能存在与 bash 相关的混淆。 - Hozikimaru
如果它可以在纯C中工作,那么肯定会有一个对应的C#版本,但要找出来,请使用您选择的搜索引擎。我只是简单地查看了一下,似乎execve也适用于C#。 - Marc Bredt

0

检查您的PATH环境变量并更新它

C:/Program Files (x86)/Git/bin/bash.exe": git: 没有那个文件或目录

这意味着git未被bash找到。

1. 检查bash中的PATH环境变量(与Windows环境变量应该保持不同)

进行相应的调整。

processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;

使终端可见。

您将使用Process.Start()创建的终端

输入:

echo ${PATH}

2. 更新您的路径

  • 您可以更新Windows的全局路径(需要重新启动)
  • 您可以更新Windows的用户路径(应该需要注销,但我不确定)。
  • 在启动Process之前,您只需使用System.Environment.SetEnvironmentVariable设置Path为所需内容即可。

附加说明:

如果您像我一样拥有多个版本的bash、命令解释器、git等等,如果您尝试将所有路径连接起来并希望找到理想的顺序,那么可能会非常混乱。您可能会看到一些奇怪的行为,直到您意识到它不是您打算运行的命令...想想FIND.exe...而且我甚至没有考虑过Windows的用户友好界面来编辑环境变量...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接