zoukankan      html  css  js  c++  java
  • shell脚本学习—Shell执行脚本

    Shell作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行这一条,这种方式称为交互式,但还有另一种执行命令的方式称为批处理方式,用户事先写一个Shell脚本,Shell可以一次把这些命令执行完。

    如下例子:

    #!/bin/bash
    echo "this is a test"
    cd ..
    ls

    Shell脚本中⽤用#表⽰示注释,相当于C语⾔言的//注释。但如果#位于第⼀一⾏行开头,并且是则例外,
    它表⽰示该脚本使⽤用后⾯面指定的解释器/bin/sh解释执⾏行。如果把这个脚本⽂文件加上可执⾏行权
    限然后

    第一种执行方式: chmod u+x script.sh

    Shell会fork⼀一个⼦子进程并调⽤用exec执⾏行./script.sh这个程序,exec系统调⽤用应该把⼦子进程的代码
    段替换成./script.sh程序的代码段,并从它的_start开始执⾏行。然⽽而script.sh是个⽂文本⽂文件,根本
    没有代码段和_start函数,怎么办呢?其实exec还有另外⼀一种机制,如果要执⾏行的是⼀一个⽂文本⽂文
    件,并且第⼀一⾏行⽤用Shebang 指定了解释器,则⽤用解释器程序的代码段替换当前进程,并且从解释
    器的_start开始执⾏行,⽽而这个⽂文本⽂文件被当作命令⾏行参数传给解释器。因此,执⾏行上述脚本相当
    于执⾏行程序 。

    第二种执行方式:/bin/bash script.sh

    shell执行过程:

    1. 交互Shell(bash)fork/exec一个子Shell(sh)用于执行脚本,父进程bash等待子进程sh终 止。
    2. sh读取脚本中的cd ..命令,调用相应的函数执行内建命令(不创建子进程,父进程运行),改变当前工作目录为上一级目 录。
    3. sh读取脚本中的ls命令,fork/exec这个程序,列出当前工作目录下的文件,sh等待ls终止。
    4. ls终止后,sh继续执行,读到脚本文件末尾,sh终止。
    5. sh终止后,bash继续执行,打印提示符等待用户输入。

    如果将命令⾏下输⼊的命令⽤()括号括起来,那么也会fork出一个子Shell执行小括号中的命令,
    一 行中可以输入由分号;隔开的多个命令,⽐比如: $ (cd ..;ls -l)

    和上⾯面两种⽅方法执⾏行Shell脚本的效果是相同的,cd ..命令改变的是⼦子Shell的PWD,⽽而不会影响
    到交互式Shell。然⽽而命令
    $ cd ..;ls -l
    则有不同的效果,cd ..命令是直接在交互式Shell下执⾏行的,改变交互式Shell的PWD,然⽽而这种⽅方
    式相当于这样执⾏行Shell脚本:
    $ source ./script.sh
    或者
    $ . ./script.sh

    source或者.命令是Shell的内建命令,这种⽅式也不会创建子Shell,而是直接在交互式Shell下逐
    步执行脚本中的命令。

  • 相关阅读:
    maven 配置报错 JAVA_HOME not found in your environment
    file控件change事件触发问题
    自己动手写easyui的checkbox
    json数组传递到后台controller
    yii2 添加模块过程
    YII框架中php入口文件隐藏
    YII框架路由和URL生成
    Node.js脚本杀掉占用端口的进程
    Java单例模式的6种写法
    HTTPS时代已来,你做好准备了吗?
  • 原文地址:https://www.cnblogs.com/-zyj/p/5753731.html
Copyright © 2011-2022 走看看