LinuxSir.cn,穿越时空的Linuxsir!

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

为什么linux下脚本文件只执行第一行命令sh,后面的就不会自动执行了?

[复制链接]
发表于 2008-10-6 17:31:11 | 显示全部楼层 |阅读模式
我用smoothwall做网关,这是一个基于linux 2.6.16.60的软路由,因为要做回流,所以参照网上的资料写了个脚本文件:
sh
iptables -t nat -A PREROUTING -d 61.*.*.* -p tcp --dport 80 -j DNAT --to 192.168.0.2
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 192.168.0.2 -p tcp --dport 80 -j SNAT --to 192.168.0.1
这三条命令如果一行一行输入后可以执行,但放在脚本文件里就只会执行第一行,结果出现“sh-2.05b#”后就不动了,这是为什么呢?
发表于 2008-10-6 17:55:20 | 显示全部楼层
sh 那一行是不对的.
改成

  1. #!/bin/sh
复制代码

或干脆删掉
回复 支持 反对

使用道具 举报

发表于 2008-10-6 20:51:29 | 显示全部楼层
找本简单的shell书看看,入个门会好些。
那个
  1. #!/bin/sh
复制代码
是告诉系统用那个shell来执行的。fedora或者说一般的linux是用bash,如果你使用:
  1. ll /bin/sh
复制代码
结果会是这样的:
  1. lrwxrwxrwx 1 root root 4 2008-07-21 22:43 /bin/sh -> bash
复制代码
就拿上面的来说可以直接这样:
  1. #!/bin/bash
复制代码
以防万一。

如果删除这一行,会使用默认的shell来解释的。如果不知道默认的是什么,最好写上那个。
回复 支持 反对

使用道具 举报

发表于 2008-10-6 20:58:51 | 显示全部楼层
所以说你这个脚本:
  1. sh
  2. iptables -t nat -A PREROUTING -d 61.*.*.* -p tcp --dport 80 -j DNAT --to 192.168.0.2
  3. iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 192.168.0.2 -p tcp --dport 80 -j SNAT --to 192.168.0.1
复制代码
使用默认的bash执行了第一条之后进入了一个新的shell环境,等待输入,没有显示退出这个shell,所以就一直等待,所以下面的不会再执行了。就如同你自己在终端输入命令
  1. sh
复制代码
一样。
回复 支持 反对

使用道具 举报

发表于 2008-10-7 14:13:27 | 显示全部楼层
撰写严格POSIX shell脚本,拒绝"#!/bin/bash"。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-10-7 14:54:06 | 显示全部楼层
谢谢!问题解决了!
回复 支持 反对

使用道具 举报

发表于 2008-10-10 02:30:00 | 显示全部楼层
嗯,写的脚本为了bash写的就是了,99%系统都有bash。~~。

坚决提倡  #!/bin/bash

嘿嘿。
回复 支持 反对

使用道具 举报

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

本版积分规则

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