为什么 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

显然第二行执行了,但第一行没有执行。

如果我改为用空白行启动“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

问题出在 shell 脚本文件本身,它以字节顺序标记开头,干扰了对第一行的解释。创建一个不以该字符开头的文件可以解决此问题。

相关内容