Sh 查找:从文件而不是cli运行时缺少-exec的参数

Sh 查找:从文件而不是cli运行时缺少-exec的参数,sh,ubuntu-14.04,command-line-interface,Sh,Ubuntu 14.04,Command Line Interface,我有一个像这样的文件 #!/bin/bash find . -type f -exec chmod 644 {} \; find . -type f -exec chown vagrant:www-data {} \; find . -type d -exec chmod 755 {} \; find . -type d -exec chown vagrant:www-data {} \; 让我们假设它被称为foo.sh 我在Ubuntu 14.04机器上,在执行它之前,我有根权限sudos

我有一个像这样的文件

#!/bin/bash

find . -type f -exec chmod 644 {} \;
find . -type f -exec chown vagrant:www-data {} \;
find . -type d -exec chmod 755 {} \;
find . -type d -exec chown vagrant:www-data {} \;
让我们假设它被称为
foo.sh
我在Ubuntu 14.04机器上,在执行它之前,我有根权限
sudosu

如果我调用
sh foo.sh
,命令行会告诉我:

# sh foo.sh 
: not foundh: 2: foo.sh: 
find: missing argument to `-exec'
find: missing argument to `-exec'
find: missing argument to `-exec'
find: missing argument to `-exec'
: not foundh: 7: foo.sh: 
但是当我直接从命令行依次运行这4个命令时,它就可以工作了。问题是:怎么了?为什么它会抱怨2号线和7号线(它们是空的)

谢谢(:

多亏了……的帮助,我终于把它修好了

问题是这些文件有Windows/DOS行结尾。不知道为什么,也许我在我的Windows机器上打开过一次。更重要的是,它是如何发生的是我如何修复它

首先找出使用的文件结尾。因此,我们可以使用命令行:

file foo.sh
如果输出如下内容:

foo.sh: Bourne-Again shell script, ASCII text executable, with CRLF line terminators
如果您有
CRLF行终止符
之类的东西,那么您必须使用
dos2unix
程序来修复它

sudo apt-get install dos2unix
dos2unix foo.sh
file foo.sh
如果尚未安装dos2unix,则只需运行apt get stuff(第一行)。 现在应该是这样的:

foo.sh: Bourne-Again shell script, ASCII text executable
现在您可以使用

sh foo.sh

进一步阅读有关文件、dos2unix和unix2dos的内容,您可以在此处找到:

作为安装
dos2unix
的替代方法:

sed -i -e "s/\r//g" foo.sh

此命令替换文件中的所有
\r
字符。

检查行尾。您没有在windows下编辑此shell脚本,是吗?我记得,我没有,但这是可能的。如何检查行尾?我在GUI上使用NetBeans作为编辑器,在使用CLI时使用nano。我可以检查我不使用它们中的任何一个,但这可能会有所帮助:感谢您的帮助(:如果有人遇到与我相同的问题,我可以修复它并将其作为下面的解决方案。接缝也可以工作。我个人更喜欢dos2unix解决方案,因为它更容易记住,并且如果行结尾发生变化,也可以将其作为解决方案(我知道,不会发生:P),dos2unix可能会得到更新,所以我们不需要做任何更改;)我也是,但有时不为这样一项简单的工作安装软件包是不可能的,或者更可取的做法。再一次投了反对票,但没有任何建议为什么这不是一个好的答案。