LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1047|回复: 5

一个很小的脚本实现make的简单功能.但有点小问题.请教

[复制链接]
发表于 2008-3-29 01:33:32 | 显示全部楼层 |阅读模式

  1. #!/bin/bash

  2. # 本脚本是为了用shell 脚本来摹拟make的简单功能.
  3. # version 1.00  2008/3/28
  4. # first you should know about **makefile's** structure
  5. #     target  : source1 source2 ...
  6. #                commands to make target

  7. makecmd ()
  8. {
  9.                 read target colon sources
  10.                 for src in $sources; do
  11.                 if [ $src -nt $target ]; then       
  12.                         while read cmd && [ $(grep \t* $cmd) ]; do
  13.                           echo "$cmd"
  14.                           eval ${cmd#\t}
  15.                         done
  16.                         break
  17.                 fi
  18.                 done
  19. } < makefile

  20. makecmd


  21. 构建了一个makefile 例子(仅仅是一个例子而已)内容如下

  22. new :  old1 old2 old3
  23.           ls -l  

  24. 其中故意设置 了文件new的日期比old1 old2 old3的日期早.以使脚本可以被make执行.问题出现了 make.则正确执行  ls -l
  25. 而执行脚本   ./makecmd  结果如下

  26. [prife@localhost shell]$ ./makecmd
  27. grep: ls: 没有那个文件或目录
  28.            ls -l
  29. 总用量 72
  30. -rw-rw-r--    1 prife    prife          61  3月 20 15:59 data
  31. -rwxr-xr-x    1 prife    prife        2582  3月 22 12:12 debug
  32. -rwxrwxr-x    1 prife    prife         780  3月  9 18:10 dirtree
  33. -rw-rw-r--    1 prife    prife         342  3月 22 18:49 findata
  34. -rwxrwxr-x    1 prife    prife         797  3月 22 21:32 finduser

  35. 也可以正确执行ls -l 但出现了  grep: ls: 没有那个文件或目录

  36. 不知道这是怎么回事?希望有人可以为我解惑
复制代码
发表于 2008-3-30 18:32:24 | 显示全部楼层
我水平还不够看懂这个,不过要帮你顶一顶。看看谁能答复

最近这里都是求代码,问问题,没有几个把自己的代码发上来的真正交流学习的,哪怕简单的几行

支持你!
回复 支持 反对

使用道具 举报

发表于 2008-3-31 15:50:10 | 显示全部楼层
水平不够,看不懂的说,友情帮顶!
回复 支持 反对

使用道具 举报

发表于 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失败时终止, 勉强可以满足你的要求  (-:
  1. #!/bin/sh
  2. makecmd ()
  3. {
  4.         read target colon sources
  5.         for src in $sources; do
  6.                 if [ $src -nt $target ]; then
  7.                         while read cmd
  8.                         do
  9.                                 echo "$cmd" | grep -s -q ':'
  10.                                 if [ $? -eq 0 ]; then  # target:...
  11.                                         break
  12.                                 else
  13.                                         echo "$cmd"
  14.                                         eval $cmd
  15.                                         if [ $? -ne 0 ]; then
  16.                                                 echo 'Failed!'
  17.                                                 exit
  18.                                         fi
  19.                                 fi
  20.                         done
  21.                         break
  22.                 fi
  23.         done
  24. } < makefile
  25. makecmd
复制代码


BTW:
为了保留代码的格式,可使用如下的写法:
[noparse]
  1. your code
复制代码
[/noparse]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-4-2 18:35:35 | 显示全部楼层
感谢chunchengfh解决我的困惑并指导我发帖.太谢谢啦.在论坛发帖这种插入代码的方法哪里可以学习一下?劳烦指点一下,给个链接就行了.,感谢tiansworld 和yanpingsha 热情顶帖.
回复 支持 反对

使用道具 举报

发表于 2008-4-3 11:15:24 | 显示全部楼层
其实我也就知道怎么贴代码。 (:
一般而言,只要将代码用“[code]”包括起来即可。文字还是放到“[code]”的外面。

找了一下论坛的帮助,你可以看看以下链接的内容。

http://linuxsir.cn/bbs/misc.php?do=bbcode
http://linuxsir.cn/bbs/faq.php?f ... q_vb_vbcode_toolbar
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表