zoukankan      html  css  js  c++  java
  • fork & exec & source

    问题起源,想在Linux环境中,通过一个bash文件,将默认文件操作目录转换到想要去的目录

    如上图,想从 ~ 目录 到 /mnt/hgfs/LinuxCode

    于是撰写了代码

    分别使用两种运行方法:

     操作 结果
    ./GoDest.bash 操作目录未改变
    source ./GoDest.bash 操作目录改变

    于是,对系统的几个关键词进行研究,

    转载于 http://blog.chinaunix.net/uid-23622436-id-3222317.html

    shell的命令可以分为内部命令和外部命令.

    内部命令是由特殊的文件格式.def实现的,如cd,ls等。sourceexec都是内部命令

    外部命令是通过系统调用或独立的程序实现的,如sed、awk等等。

    fork
       使用 fork 方式运行 script 时, 就是让 shell(parent process) 产生一个 child process 去执行该 script, 当 child process 结束后, 会返回 parent process,但 parent process 的环境是不会因 child process 的改变而改变的.(上文的系统当前工作目录就是环境变量)。通常如果我们执行时,都是默认为fork的
    source
       使用 source 方式运行 script 时, 就是让 script 在当前 process 内执行, 而不是产生一个 child process 来执行. 由于所有执行结果均于当前 process 内完成,若 script 的环境有所改变, 当然也会改变当前 process 环境了.
    source ./my.sh 或 . ./my.sh
    exec
       使用 exec 方式运行script时, 它和 source 一样, 也是让 script 在当前process内执行, 但是 process 内的原代码剩下部分将被终止. 同样, process 内的环境随script 改变而改变.

    使用下述经典代码进行测试

    1.sh

    #!/bin/bash
    
    A=B
    echo "PID for 1.sh before exec/source/fork: $$"
    export A
    echo "1.sh: $A is $A"
    case $1 in
        exec)
            echo "using exec..."
            exec ./2.sh ;;
        source)
            echo "using source..."
            . ./2.sh;; # source ./2.sh
        *)
            echo "using fork by default"
            ./2.sh;;
    esac
    
    echo "PID for 1.sh after exec/source/fork: $$"
    echo "1.sh: $A is $A"

    2.sh

    #!/bin/bash
    echo "PID for 2.sh: $$"
    echo "2.sh get $A=$A from 1.sh"
    A=C
    export A
    echo "2.sh:$A is $A"

    分别运行

    $ ./1.sh fork 
    $ ./1.sh source 
    $ ./1.sh exec 

    source

    没有创建新的工作目录

    $A的值在当前目录下被修改

    exec

    没有创建新的工作目录

    $A的值在当前目录下被修改,但是 process 内的原代码剩下部分将被终止

    fork

    新建一个工作目录

    $A的值在新的目录下被修改,原来目录下$A的值没有修改

  • 相关阅读:
    Redis 发布与订阅
    Redis 数据持久化的理解
    自定义shell脚本快速搭建LNMP环境
    PHP环境配置与优化(Ubuntu16.04/PHP7)
    记录在ios系统上,自研app,灰度环境遇到的一个vue页面dom节点已渲染,但是显示部分空白的情况
    记录在苹果6p/6sp,10版本上,app内交互token等用户信息丢失的问题
    记录在苹果X手机上运行遇到的代码Dom被阻塞不更新的一个坑
    巧用flex(一)
    谷歌浏览器调试手机app内置网页
    与app交互因异步造成的坑记录
  • 原文地址:https://www.cnblogs.com/wuqi/p/4612523.html
Copyright © 2011-2022 走看看