我有这段代码可以通过命令行在Windows和Linux上运行csv导入:
var isLinux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux);
ProcessStartInfo startInfo = null;
if (isLinux)
{
startInfo = new ProcessStartInfo
{
FileName = @"/bin/bash",
Arguments = $"-c 'cat \"{filePath}\" | psql -h 127.0.0.1 -U {user} -d {dbname} -w -c \"copy data_temp from stdin csv header\"' ",
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true,
};
}
else
{
startInfo = new ProcessStartInfo
{
FileName = @"cmd.exe",
Arguments = $"/c cat \"{filePath}\" | psql -h 127.0.0.1 -U {user} -d {dbname} -w -c \"copy data_temp from stdin csv header\" ",
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true,
};
}
using (var process = new Process { StartInfo = startInfo})
{
process.Start();
string result = process.StandardOutput.ReadToEnd();
process.WaitForExit();
}
它在Windows上运行良好,但在Linux(Ubuntu 18.04)上,result
始终为空白,并且导入无效。
我尝试在终端中编写查询:
/bin/bash -c 'cat "/path/file.csv" | psql -h 127.0.0.1 -U user -d user -w -c "copy data_temp from stdin csv header"'
它工作正常,但是从我的代码运行时,它仅返回空字符串且不导入。
我在这里做什么错了?
编辑:我想到这可能是权限问题。这段代码在我的asp.net核心Web应用程序中,因此它将以用户www-data
的身份运行。 www-data
设置为nologin,因此这可能会导致问题。不确定解决方案
答案 0 :(得分:2)
问题是单引号不起作用。我改为双引号,并且有效。