Bash脚本作为.command无法正常执行

时间:2014-04-03 04:06:54

标签: macos bash shell unix terminal

我有一个简单的脚本/命令:

当我从shell运行它时:

 txt=testfile
 find ~/Desktop/Rory/Test -type f -exec grep $txt {} \; -exec mkdir $txt \; 

结果是:

Binary file ./TEST.zip matches
and it makes a new directory named testfile

当我将其保存为.command时:

echo "cd: \c"
read dir
echo "txt: \c"
read str
find $dir -type f -exec grep $str {} \; -exec mkdir $str \;

chmod 755然后双击它我得到:

Last login: Wed Apr  2 20:44:14 on ttys004
zipher:~ Rory$ /Users/Rory/Desktop/CD.command ; exit;
cd: \c
/Users/Rory/Desktop/Test
txt: \c
txt

然后它进入go to hell in a handbasket,递归地进入另一个命令从不冒险的地方 - 我必须^ C它因为它已经消失了。它也没有创建新目录..我在哪里screw the pooch

1 个答案:

答案 0 :(得分:1)

我没有具体的解释,只有一些指示:

  • 您的脚本是否有bash shebang行(文件#!/usr/bin/env bash的第一行)?我已经看到OSX在没有它的情况下表现得很奇怪。

  • 我认为提示字符串中的\c旨在取消尾随换行符 - 默认情况下这不会在bash中生效 - 您需要调用echo -e,或者 - 最好 - 只使用printf - 例如,printf "cd: "

  • 我建议您在find命令中双引号变量引用,这样如果输入的路径或字符串包含嵌入的空格或其他字符,命令就不会中断。具有特殊意义的外壳。

到目前为止,我们得到了:

printf "cd: "
read dir
printf "txt: "
read str
find "$dir" -type f -exec grep -l "$str" {} \; -exec mkdir "$str" \;

还有更多:

  • 请注意find处理指定目录的整个子树;如果您只想匹配当前目录中的文件,请添加-maxdepth 1

  • 请注意-exec执行当前目录中的命令,无论匹配文件在何处找到 - 如果您希望在输入目录中创建所有目录,相反,使用-exec mkdir "$dir/$str" \;如果要创建在找到每个匹配文件的子目录中创建的目录,请使用-execdir mkdir "$str" \;