Help us understand the problem. What is going on with this article?

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#拡張機能をインストール

image.png

(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箇条

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away