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

find: missing argument to -exec when run from file but not from cli

我有一个看起来像这样的文件

#!/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 机器上,在我执行它之前我有 root 权限 sudo su

如果我调用 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 行(它们是空的)

谢谢 (:

感谢 @fejese 的帮助,我设法修复了它。

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

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

file foo.sh

如果输出如下:

foo.sh: Bourne-Again shell script, ASCII text executable, with CRLF line terminators

如果你有 CRLF line terminators 东西,那么你必须用 dos2unix 程序修复它。

sudo apt-get install dos2unix
dos2unix foo.sh
file foo.sh

如果你还没有安装 dos2unix,你只需要 运行 apt-get 的东西(第一行)。 现在它应该看起来像这样:

foo.sh: Bourne-Again shell script, ASCII text executable

现在您可以 运行 使用

没有任何问题
sh foo.sh

有关文件、dos2unix 和 unix2dos 的进一步阅读,您可以在此处找到:View line-endings in a text file

作为安装 dos2unix 的替代方法:

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

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