【发布时间】: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 的链接中查看该示例,因为它看起来与您正在做的非常相似。
标签: c# linux asp.net-core ubuntu apache-fop