我正在使用Linux机器进行开发,然后将我的脚本文件部署到Azure机器应用程序,这是一台Windows机器。
然后我将shell脚本文件从Azure功能应用程序复制到wasb。
在Azure HDI群集上的Edge节点中运行shell脚本时出现以下错误
$'\r': command not found
我的脚本文件未正确执行。
在C#Azure函数中转换dos2unix选项的最佳方法是什么?
答案 0 :(得分:2)
您不必做任何特别的事情来阅读包含Unix风格换行符(\n
)而不是\r\n
的文件。 .NET IO方法将两者视为换行符。
你可以写
var lines-File.ReadAllLines("myUnixText.txt");
或
using(var reader=File.OpenText("myUnixText.txt"))
{
string line;
while( (line=reader.ReadLine()) !=null)
{
// Do something
}
}
读取行结尾是\r
还是\n
证明:
var numbers = new[]{1,2,3,4,5,6};
var lines=String.Join("\n",numbers);
File.WriteAllText("myUnixText.txt",lines);
var newLines=File.ReadAllLines("myUnixText.txt");
Debug.Assert(newLines.Length==6);
即使只写了单个字符串,File.ReadAllLines
也会从文件中读取6行
答案 1 :(得分:1)
答案 2 :(得分:1)
在将文件从Azure功能复制到WASB之前,我正在调用Dos2Unix(filePath)方法。
通话方式: -
Dos2Unix(D:\home\site\repository\sample.sh);
以下方法实际上适用于C#Azure函数。
private void Dos2Unix(string fileName)
{
const byte CR = 0x0D;
const byte LF = 0x0A;
byte[] data = File.ReadAllBytes(fileName);
using (FileStream fileStream = File.OpenWrite(fileName))
{
BinaryWriter bw = new BinaryWriter(fileStream);
int position = 0;
int index = 0;
do
{
index = Array.IndexOf<byte>(data, CR, position);
if ((index >= 0) && (data[index + 1] == LF))
{
// Write before the CR
bw.Write(data, position, index - position);
// from LF
position = index + 1;
}
}
while (index >= 0);
bw.Write(data, position, data.Length - position);
fileStream.SetLength(fileStream.Position);
}
}
更新1: -
这是我的代码,用于将文件(*。sh,* .jar,* .img等)上传到blob存储。
public bool UploadBlobFile(string containerName, string blobName, string filePath)
{
try{
CloudBlobContainer container = blobClient.GetContainerReference(containerName);
CloudBlockBlob blob = container.GetBlockBlobReference(blobName);
// convert dos2unix format
Dos2Unix(filePath);
using (var fileStream = System.IO.File.OpenRead(filePath))
{
blob.UploadFromStream(fileStream);
}
return true;
} catch (Exception e) {
log.Info("Exception: " + e);
return false;
}
}
答案 3 :(得分:0)
您似乎有Windows样式行结尾(\ r \ n) - 您需要将它们更改为unix样式(\ n)。
参考:'\r': command not found和Convert DOS line endings to Linux line endings in vim
答案 4 :(得分:0)
sourceforge中有一个工具可以执行此操作。 最近已经实现了很好的运行。