bash,可执行文件在命令行中运行但不在脚本中运行

时间:2012-07-20 19:19:33

标签: shell cygwin command-line-arguments

这是交易。我在Win7环境中安装了cygwin。这是我将在命令行中执行的一系列操作,一切正常,

文件mpc.exe是由英特尔Fortran编译器

创建的64位可执行文件
cp ./dir1/dir2/mpc.exe ./mpc.exe
./mpc.exe arg1 arg2

一切都很好

想要为此创建脚本。原因是我想要为arg2的各种值执行代码。文件“script_mpc.sh”包含以下内容,

#!/bin/sh
cp ./dir1/dir2/mpc.exe ./mpc.exe
./mpc.exe arg1 arg2
wait
return_val=$?
[ $retval -eq 0 ] && echo "successfully executed "

现在回到命令行,

$>chmod +x script_mpc.sh
$>./script_mpc.sh

错误:

./script_mpc.sh: line 2: ./mpc.exe: No such file or directory

一个非常新鲜的初学者。随时随地学习shell命令和脚本。请帮忙。

1 个答案:

答案 0 :(得分:1)

你在Cygwin上。

我敢打赌这一行:

cp ./dir1/dir2/mpc.exe ./mpc.exe

有一个Windows风格的CR-LF线结尾。 shell(sh或bash)将CR解释为文件名的一部分,因此它将文件复制到"./mpc.exe\r"

通过dos2unix过滤脚本。请务必先阅读手册页;与大多数文本过滤器不同,它通常会覆盖输入文件。

背景:

Unix使用单个ASCII LF字符标记文本文件中行的结尾。 Windows使用CR-LF对。 Cygwin是一个类似Unix的仿真层,位于Windows之上,因此它往往是一个有冲突的行尾表示问题的丰富来源。

特别是,Unix shell通常不会将CR识别为行尾指示符的一部分;相反,他们将它视为另一个角色 - 一个往往不可见的角色,这取决于你如何看待文件。

您可能混合使用LF和CR-LF线路结尾。如果它始终如一地使用CR-LF结尾,则无法识别#!/bin/sh#!/bin/bash行。

如果可能,只使用Unix风格的编辑器(vim,emacs,nano或其他任何你喜欢的)来编辑shell脚本。如果您使用记事本或写字板创建脚本,则可能会遇到此类问题。