C#(.NET Core2.2)アプリをLinuxで動かし、シェルスクリプトを実行したらエラー


やりたいこと

  • C#コンソールアプリにより、LinuxからWindowsのフォルダをマウントする(mountコマンド)
    • Windows10上の仮想マシン(Linux)で、C#アプリを動かす
    • C#アプリで、Linuxのシェルスクリプトファイル(.sh)を実行する
    • .shファイルに、mountコマンドを記述しておく

経緯

仕事で検証が必要になったため。

環境

  • ホストマシン:Windows10
  • ゲストマシン:CentOS 7(Windows10のVirtualBox上)
  • 開発言語:C#(.NET Core2.2)
  • エディタ、ビルド:Visual Studio Code 1.34.0(Windows10上)

手順

1. C#アプリの準備

(1)「.NET Core SDK」をインストール(Windows10)

(今回は、.NET Core SDK 2.2.300)
https://dotnet.microsoft.com/download#/sdk

(2)Visual Studio Codeに、C#拡張機能をインストール

(3)コーディング、ビルド

次のようなコードで、.shを実行します。(真新しいことはありません・・・)

using System.Diagnostics;
// (省略)
  var processInfo = new ProcessStartInfo();
  processInfo.FileName = "/bin/sh";
  processInfo.UseShellExecute = false;
  processInfo.RedirectStandardOutput = true;
  processInfo.Arguments = @"./xxx.sh";

  Process process = Process.Start(processInfo);
  var stdOutput = process.StandardOutput.ReadToEnd();
  process.WaitForExit();

Linux用に、自己完結型の展開でビルドしました。

dotnet publish -c Release -f netcoreapp2.2 -r linux-x64 --self-contained true

2. .shファイルの準備

次のようなコマンドを記述。
・share_test:VirtualBoxで設定した共有フォルダー名
・/mnt/win_test:Linux側の、マウントするディレクトリ

xxx.sh
sudo mount -t vboxsf share_test /mnt/win_test

確認結果

エラー

Linux上でアプリを実行したところ、次のようなエラーが発生し、マウントされませんでした。

No such file or directory

確認

  • コマンド自体は不備がない
     .shファイルに記述しているコマンドを、Linuxのターミナルで実行すると正常にマウントできます。

  • C#から.shファイルの実行も問題なさそう
     また、.shファイルにecho XXというコマンドを記述すると正常に出力されます。

原因

.shファイル内の改行コードに問題がありました。
-> 改行が「Cr+Lf」になっていた。
-> 「Lf」で保存したところ、正常にマウントできました。

Linuxは改行をLfで判断する為、記述したコマンドに「Cr」まで含まれてしまい、
そんなはパスは存在しないというエラーになっていたようです。
(Linuxをあまり使った事がなく、なかなか分かりませんでした・・・)

今後

結局、開発言語は関係なく、単にLinuxについて勉強不足という話でした。
きちんと勉強しようと思います。。

参考

↓この情報に辿り着くまで時間が掛かりました・・・
シェルスクリプトを書くときに気をつける9箇条