LinuxSir.cn,穿越时空的Linuxsir!

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

如何判断某程式成功与否?

[复制链接]
发表于 2009-2-8 16:42:55 | 显示全部楼层 |阅读模式
在一个bash scrip里,我想跑a.out,如果成功就用tail看結果,否則就fail:

  1. ( a.out || (echo "DIE!!"; exit 1)) | tail
复制代码


在a.out faile的情况下"DIE!!"被echo出来,但我的script并不exit.为什么?
发表于 2009-2-8 18:30:13 | 显示全部楼层
你的程序有意思,呵呵。
如果你可以容忍a.out失败前的输出,这样写就可以了
a.out || echo "Fail" | tail
如果你不能容忍,就用下面的命令(这个命令不知在你那里能否成功,反正在我这儿是成功了):
a="$(a.out)" && echo "$a" || echo "fail"  | tail
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-2-8 19:49:58 | 显示全部楼层
Post by tomgrean;1945154
你的程序有意思,呵呵。
如果你可以容忍a.out失败前的输出,这样写就可以了
a.out || echo "Fail" | tail
如果你不能容忍,就用下面的命令(这个命令不知在你那里能否成功,反正在我这儿是成功了):
a="$(a.out)" && echo "$a" || echo "fail"  | tail

如果a.out失败,我不想看它到stdout的输出(stderr ok)。你的第二个命令在我这里也可以。但是我不是要echo "FAIL",而是要以状态0离开整个script而不执行这行以後的其他指令。我大概发现问题的重点了。exit 和 | tail不能放在同一行。以下大概得到我需要的結果:
  1. out=$(a.out) || (echo "FAILED"; exit 0)
  2. echo $out | tail
复制代码
但是这样出来的$out里面完全没有断行符。整个$out只有一行。tail变多余了。
回复 支持 反对

使用道具 举报

发表于 2009-2-9 05:02:02 | 显示全部楼层
  1. if a.out > _tmp.$$; then
  2.     tail _tmp.$$
  3. else
  4.     echo "FAILED"
  5. fi
  6. rm -f _tmp.$$
复制代码
回复 支持 反对

使用道具 举报

发表于 2009-2-9 18:34:27 | 显示全部楼层
Post by mathfeel;1945187
如果a.out失败,我不想看它到stdout的输出(stderr ok)。你的第二个命令在我这里也可以。但是我不是要echo "FAIL",而是要以状态0离开整个script而不执行这行以後的其他指令。我大概发现问题的重点了。exit 和 | tail不能放在同一行。以下大概得到我需要的結果:
  1. out=$(a.out) || (echo "FAILED"; exit 0)
  2. echo $out | tail
复制代码
但是这样出来的$out里面完全没有断行符。整个$out只有一行。tail变多余了。

你应该注意使用引号来引用.
实际上,我也建议使用楼上的临时文件的方法, 因为如果a.out输出内容非常多, 可能会对Shell 有很大的影响.
  1. out="$(a.out)" || (echo "FAILED"; exit 0)
  2. echo "$out" | tail
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-2-11 14:40:21 | 显示全部楼层
Post by biinn;1945341

  1. if a.out > _tmp.$$; then
  2.     tail _tmp.$$
  3. else
  4.     echo "FAILED"
  5. fi
  6. rm -f _tmp.$$
复制代码


学到東西了($$=shell pid)。之前还要想写个temp file collision的script...现在免了。
回复 支持 反对

使用道具 举报

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

本版积分规则

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