shell执行命令

转载地址:http://book.51cto.com/art/200805/73702.htm

shell命令的执行:http://blog.csdn.net/buaa_shang/article/details/8681097

1.shell命令分为内置命令(内部命令)和外部命令。

外部命令是通过系统调用或独立的程序实现的,如sed、awk等等。内部命令是由特殊的文件格式(.def)所实现,如cd、history、exec等等。

内置命令是shell解释程序内建的,由shell直接执行,不需要派生新的进程。参见第5.5节以获取更多信息。

内置命令是操作系统本身自带的命令,不需要外部软件支持的命令,属于shell的一部分(内置在系统中)。如果用一个简单文件名作为命令,shell将首先检查它是否是某条内置命令的名字。如果是内置命令名称,那么shell将其作为调用进程的一部分执行,也就是说shell并不会创建新的进程执行内置命令。shell并不需要在文件结构中搜索内置命令程序,这是因为shell可以立即访问它们。

举例:

C Shell内置命令包含很多,if、exit、cd和while等等,可以看http://server.it168.com/a2010/0203/847/000000847564.shtml

外部命令分为二进制代码和shell脚本。例如拷贝命令cp和移动命令rm,是存在于文件系统中某个目录下的单独的程序。对用户而言,不必关心一个命令是建立在shell内部还是一个单独的程序。


2.执行方法:

(1)为了执行外部的二进制命令,需要一种机制,以允许子进程转换为将要被执行的命令。Unix/Linux调用exec可以做到这些。它允许一个进程用其他命令的可执行代码覆盖自己。二进制代码需要由磁盘装入内存中执行。shell解释程序会调用fork自身的一个拷贝,然后用exec系列函数来执行外部命令,这样外部命令就取代了当前的fork的子shell.

(2)shell脚本的执行与二进制文件略有不同。

第一种方法:新产生一个shell,然后执行相应的shell scripts

在srcipt下加入以下语句 #!/bin/sh

对于shell脚本来说,shell解释程序会fork+exec执行这个脚本命令,会fork一个子shell程序,子shell程序会检查脚本的第一行(如#!/bin/bahs),找到用来执行脚本的解释程序,然后装入这个解释程序,由它执行脚本程序。在此解释程序显然是当前shell的子进程。如果这个解释程序与当前使用的shell是同一种shell,比如都是bash,它就是当前shell的子shell,脚本中的命令都是在子shell环境中执行的,不会影响当前shell的环境。

第二种方法:不再产生新的shell,而在当前shell下执行一切命令。

source a.sh


当用户向shell中输入一行命令时,shell同时创建(衍生)一个子进程来执行这条命令。当子进程执行该命令期间,父进程转入睡眠状态。当某个进程睡眠时,它并不占用任何计算机时间,但是它还保持非活跃状态,等待被唤醒。当子进程的命令执行完毕之后,它将通过其退出状态通知其父进程自己执行成功或者失败,然后消逝。父进程(正在运行shell的进程)被唤醒,然后提示用户输入另外一个命令。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值