|
发表于 2008-4-1 18:48:05
|
显示全部楼层
看楼上的兄弟这么热心,不好意思视而不见,呵呵
出错的原因是grep用法有误:
正确的用法为: grep ’xxx‘ filename, 而script中的 $cmd 为字符串 'ls -l', 被grep当成文件了。而并无名为'ls' 和 '-l' 的两个文件存在。 正确的写法是: $(echo "$cmd" | grep \t*);
而从makefile的语法考虑,更正确的写法是: $(echo "$cmd" | grep ‘\t’);
不过最大的问题是,代码'read cmd'将字符串读入变量cmd中时,shell会将前后的空格都去掉,所以用grep查找’\t'是不能成功的。
我将实现修改了一下,当查找到下一个含有‘:’的行时退出,当运行eval失败时终止, 勉强可以满足你的要求 (-:- #!/bin/sh
- makecmd ()
- {
- read target colon sources
- for src in $sources; do
- if [ $src -nt $target ]; then
- while read cmd
- do
- echo "$cmd" | grep -s -q ':'
- if [ $? -eq 0 ]; then # target:...
- break
- else
- echo "$cmd"
- eval $cmd
- if [ $? -ne 0 ]; then
- echo 'Failed!'
- exit
- fi
- fi
- done
- break
- fi
- done
- } < makefile
- makecmd
复制代码
BTW:
为了保留代码的格式,可使用如下的写法:
[noparse][/noparse] |
|