LinuxSir.cn,穿越时空的Linuxsir!

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

对#! /bin/rm有点不明白

[复制链接]
发表于 2006-7-1 21:22:21 | 显示全部楼层 |阅读模式

  1. #! /bin/rm
  2. echo self
复制代码

保存为self.sh
如果以bash self.sh的方式运行就会显示出结果“self”,文件还存在,但是如果以./self.sh的方式运行,那么就不会运行echo这句,而且文件也没了?
不懂,谁能解释一下么?
 楼主| 发表于 2006-7-1 21:41:14 | 显示全部楼层
还有一个问题,同一类的

  1. #! /bin/more
  2. a=100
  3. b=200
  4. c=300
复制代码

保存为text.sh,然后用bash text.sh结果就是一片空白,如果使用./text.sh执行,就是显示出a=100 b=200 c=300
一样的问题,怎么解释呢?不明白?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-7-1 21:48:55 | 显示全部楼层
一下子没有反应过来,现在想明白了。
#! /bin/rm这一行表示的就是用哪一个程序来执行这个脚本,所以当使用./self.sh的时候就使用self.sh作为参数,执行rm self.sh,自然文件就没有了,当用bash来执行的时候,#! /bin/rm这一行实际就被忽略了,而是直接用bash self.sh来解释这个脚本,所以就的出来了刚才的那个结果,应该就是这样的情况了。
不知道我理解的对不对,高手指点一下.
回复 支持 反对

使用道具 举报

发表于 2006-7-1 21:51:16 | 显示全部楼层
Post by X10er
一下子没有反应过来,现在想明白了。
#!这一行表示的就是用哪一个程序来执行这个脚本,所以当使用#! /bin/rm的时候就使用脚本文件作为参数,执行rm,自然文件就没有了,当用bash来执行的时候#!这一行实际就被忽略了,而是直接用bash来解释这个脚本,所以就的出来了刚才的那个结果,应该就是这样的情况了。
不知道我理解的对不对,高手指点一下.

是的,而且 #! 后面的东西是有内核来读取执行的,如果直接把文件传给 bash ,内核就没有机会去读那一行了,而 bash 也只会把他看成普通注释。
回复 支持 反对

使用道具 举报

发表于 2006-7-1 21:54:08 | 显示全部楼层
第一个sh self.sh,第一行被shell看作注释,而被忽略。

第二个直接执行self.sh,这时第一行称为shebang,#!是扮演的是16bit magic number的角色,告诉kernel,这是个可执行文件,后面紧跟的是调用的命令解释器或命令。

就self.sh来说,文件本身作为argv[1]传导给/bin/rm,所以就被自身删除了。
回复 支持 反对

使用道具 举报

发表于 2006-7-1 21:54:57 | 显示全部楼层
已经回答了。
回复 支持 反对

使用道具 举报

发表于 2006-7-1 21:57:51 | 显示全部楼层
  1. #!/bin/cat

  2. hello world
复制代码


最简单的自产生程序。
回复 支持 反对

使用道具 举报

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

本版积分规则

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