plink または bash がリモート コマンド ファイルの最初の行のコマンドを認識しないのはなぜですか?

plink または bash がリモート コマンド ファイルの最初の行のコマンドを認識しないのはなぜですか?

私は PowerShell で plink と pageant を使用して、ssh 経由で Linux マシンに接続し、コマンドを実行しています。PS スクリプト内で、次のように plink に UNIX スクリプト ファイルを提供しようとしています。

テスト.ps1:

$remote_cmd_file = "test.sh"

pageant $priv_key
plink $usr@$dom -batch -m $remote_cmd_file

(変数 $usr、$dom、および $priv_key は適切に定義されていますが、ここでは示されていません。)

「test.sh」ファイルの全内容は次のとおりです。

cd /
pwd

出力は次のようになります:

plink : bash: cd: command not found
At C:\workspace\test.ps1:8 char:1
+ plink $usr@$dom -batch -m $remote_cmd_file
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (bash: cd: command not found:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

/my/remote/home/directory

したがって、明らかに 2 行目は実行されましたが、1 行目は実行されませんでした。

代わりに空白行で「test.sh」を開始すると、同様のメッセージが表示されますが、両方のコマンドが実行されます。出力は次のようになります。

plink : bash: : command not found
At C:\workspace\test.ps1:8 char:1
+ plink $usr@$dom -batch -m $remote_cmd_file
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (bash: : command not found:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

/

最後に、次のような行でスクリプトを開始すると、

#!/bin/bash

それから私は

plink : bash: #!/bin/bash: No such file or directory
At C:\workspace\test.ps1:8 char:1
+ plink $usr@$dom -batch -m $remote_cmd_file
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (bash: #!/bin...le or directory:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

/

ただし、スクリプト内の他の場所で # で始まる行はコメントとして正しく解釈され、出力は生成されません。

これは plink または bash の問題のようですが、これに関する既存の質問は見つかりませんでした。回避策として、最初の行を空白のままにしておくことですべてのコマンドを確実に実行できるようですが、警告が煩わしく、この異常の原因が何なのか疑問に思っています。

参考になれば幸いですが、私の最終的な目標は、このスクリプトを使用して、slurm 経由でリモート マシンにジョブを送信し、いくつかのファイルを変換し、同じ PowerShell スクリプト内でローカル マシン上のそれらのファイルを使用して、コマンド ラインからさまざまな Windows プログラムを呼び出すことです。

答え1

問題はシェル スクリプト ファイル自体にあり、最初の行の解釈を妨げるバイト オーダー マークで始まっていました。その文字で始まらないファイルを作成することで、問題は解決しました。

関連情報