Shell 脚本文件(.sh)不能从 Linux 上的 c# 核心运行

Posted

技术标签:

【中文标题】Shell 脚本文件(.sh)不能从 Linux 上的 c# 核心运行【英文标题】:Shell Script File(.sh) does not run from c# core on linux 【发布时间】:2017-02-23 23:44:14 【问题描述】:

我正在尝试从 c# 核心应用程序运行“.sh”文件。但它似乎运行不正常。这是我的方案。

我正在开发托管在 Linux 环境中的 .Net 核心项目。我们正在尝试在我们使用“Apache FOP”的项目中创建“PDF”。 在这里,我创建了一个“shell脚本”文件“transform.sh”,它在内部调用“fop”并带有所需的参数。由于开发是在windows机器上完成的,我们测试了相同的usinf“批处理”文件,即“transform.bat”,但是由于我们无法在 linux 环境中使用“批处理”文件,因此我们创建了 shell 脚本文件“transform.sh”

以下是“transform.sh”中的代码

./fop -xml $1 -xsl $2 -pdf $3

以下是我从中调用“shell 脚本文件”的 C# 代码

    var process = new Process
                        
                            StartInfo = new ProcessStartInfo
                            
                                UseShellExecute = false,
                                RedirectStandardOutput = true,
                                Arguments = string.Format("0 1 2", XML_filename, XSL_filename, output)                                
                            
                        ;

    process.StartInfo.FileName = "Path to shell script file";
    process.Start();
    process.WaitForExit();

上面的代码没有给出任何错误,但它也没有创建 pdf 文件。如果我直接从“终端”运行 shell 脚本文件,它可以正常工作并创建 pdf 文件。

 ./transform.sh "/home/ubuntu/psa//PdfGeneration/ApacheFolder/XMLFolder/test.xml" "/home/ubuntu/psa/PdfGeneration/ApacheFolder/XSLTFolder/Certificate.xsl" "/home/ubuntu/psa/PdfGeneration/ApacheFolder/PDFFolder/t444t.pdf"

如果我做错了什么,请告诉我?如何通过 C# 核心应用程序使 sheel 脚本在 linux 上运行。 谢谢。

【问题讨论】:

您发送到 bash 脚本的参数中是否有空格?无论哪种方式,您的参数字符串都应该在每个参数周围加上引号。 Check out the last example here for escaping double quotes。 bash 脚本是否会执行?您可以在脚本中添加touch \some\file 以查看它是否正在执行。 是的,每个参数之间有空格 我的意思是参数中的空格。就像/home/ubuntu/my folder/myfile.xml 一样,当您将参数传递给Linux 中的shell 脚本时,将这些参数封装在引号中很重要,这样它们就不会被拆分为多个参数。也许,要查看脚本的内容,请将脚本更改为:echo "$1" "$2" "$3" > /home/ubuntu/scripttest.txt。然后运行你的程序来执行脚本,看看什么被踢进了那个文件。 我按照您的建议进行了检查,在我看来,“transform.sh”文件没有被代码本身调用。但我已经为进程提供了“.sh”文件的正确路径。使用进程调用“.sh”文件是否正确? 我根本不知道 ProcessStartInfo 对象。但是...查看文档后,我的猜测是删除Process.StartInfo.FileName="Path" 行上的Process.,然后在下一行中使用该ProcessStartInfo,如Process.Start(StartInfo)。在我的第一条评论also here 的链接中查看该示例,因为它看起来与您正在做的非常相似。 【参考方案1】:

迟到的答案,但对我来说,只需将 RedirectStandardOutput 设置为 true 并像这样更改 FileName 属性即可:

processInfo.FileName = @"C:\Program Files\Git\git-bash.exe"; 
processInfo.RedirectStandardOutput = true;

【讨论】:

【参考方案2】:

我能够解决这个问题,只是想我应该把我的解决方案放在这里,以便将来可以帮助其他人......

如问题中所述,我无法通过 linux 机器上的 shell 脚本生成 PDF 文件。按照“@JNevill”的建议进行调试后,我了解到没有从 .net 进程本身调用 shell 脚本文件.

所以我的第一个任务是制作通过.Net Process 调用的shell 脚本文件。 在通过网络进行大量搜索并尝试不同的解决方案后,我在 How to perform command in terminal using C#(Mono) 找到了解决方案。

所以改变了我调用进程的代码如下,

var command = "sh";
var myBatchFile = //Path to shell script file
var argss = $"myBatchFile xmlPath xsltPath pdfPath"; //this would become "/home/ubuntu/psa/PdfGeneration/ApacheFolder/ApacheFOP/transform.sh /home/ubuntu/psa/PdfGeneration/ApacheFolder/XMLFolder/test.xml /home/ubuntu/psa/PdfGeneration/ApacheFolder/XSLTFolder/Certificate.xsl /home/ubuntu/psa/PdfGeneration/ApacheFolder/PDFFolder/test.pdf"

var processInfo = new ProcessStartInfo();
processInfo.UseShellExecute = false;
processInfo.FileName = command;   // 'sh' for bash 
processInfo.Arguments = argss;    // The Script name 

process = Process.Start(processInfo);   // Start that process.
var outPut = process.StandardOutput.ReadToEnd();
process.WaitForExit();

更改代码后,“.sh”文件被执行,我能够生成 PDF 文件。

还需要更改调用 Apache FOP 文件的“.sh”文件(即 (transform.sh))的脚本,即“FOP.sh”。

最初的代码是

./fop -xml $1 -xsl $2 -pdf $3

我更改如下,(更改是提供 FOP 文件的完整路径)

/home/ubuntu/psa/PdfGeneration/ApacheFolder/ApacheFOP/fop -xml $1 -xsl $2 -pdf $3

【讨论】:

以上是关于Shell 脚本文件(.sh)不能从 Linux 上的 c# 核心运行的主要内容,如果未能解决你的问题,请参考以下文章

shell 脚本基础知识详细介绍

一起来学linux:shell script关于脚本

Linux下如何执行Shell脚本

linux sh -n 文件 运行后两个加号++ 啥意思?

linux上写了脚本,不能执行!求解答!

如何在Windows下运行linux shell脚本