zoukankan      html  css  js  c++  java
  • linux 下source、sh、bash、./执行脚本的区别

    今天练习shell时,发现用bash执行和 . 执行 $0的值是不一样的,转载一篇文章学习一下

    1、source命令用法:
      source  FileName
      作用:在当前bash环境下读取并执行FileName中的命令。该filename文件可以无"执行权限"
      注:该命令通常用命令“.”来替代。
      如:source .bash_profile
        . .bash_profile两者等效。
      source(或点)命令通常用于重新执行刚修改的初始化文档。
      source命令(从 C Shell 而来)是bash shell的内置命令。
      点命令,就是个点符号,(从Bourne Shell而来)。
      source的程序主体是bash,脚本中的$0变量的值是bash,而且由于作用于当前bash环境,脚本中set的变量将直接起效
     
    2、 sh, bash的命令用法:
       sh/bash FileName
       作用:打开一个子shell来读取并执行FileName中命令。该filename文件可以无"执行权限"
       注:运行一个shell脚本时会启动另一个命令解释器.
         每个shell脚本有效地运行在父shell(parent shell)的一个子进程里.
          这个父shell是指在一个控制终端或在一个xterm窗口中给你命令指示符的进程.
         shell脚本也可以启动他自已的子进程.
          这些子shell(即子进程)使脚本并行地,有效率地地同时运行脚本内的多个子任务.
      在ubuntu中sh只是bash的一个链接。
      由于是在子shell中执行,脚本设置的变量不会影响当前shell。
     
    3、./的命令用法:
       ./FileName
       作用:打开一个子shell来读取并执行FileName中命令。该filename文件需要"执行权限"
       注:运行一个shell脚本时会启动另一个命令解释器.
         每个shell脚本有效地运行在父shell(parent shell)的一个子进程里.
          这个父shell是指在一个控制终端或在一个xterm窗口中给你命令指示符的进程.
         shell脚本也可以启动他自已的子进程.
          这些子shell(即子进程)使脚本并行地,有效率地地同时运行脚本内的多个子任务.
      由于是在子shell中执行,脚本设置的变量不会影响当前shell。
     
    exec和source都属于bash内部命令(builtins  commands),在bash下输入man exec或man source可以查看所有的内部命令信息。

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

    在说明exe和source的区别之前,先说明一下fork的概念。

    fork是linux的系统调用,用来创建子进程(child process)。子进程是父进程(parent  process)的一个副本,从父进程那里获得一定的资源分配以及继承父进程的环境。子进程与父进程唯一不同的地方在于pid(process id)。

    环境变量(传给子进程的变量,遗传性是本地变量和环境变量的根本区别)只能单向从父进程传给子进程。不管子进程的环境变量如何变化,都不会影响父进程的环境变量。


    shell script:

    有两种方法执行shell scripts,一种是新产生一个shell,然后执行相应的shell  scripts;一种是在当前shell下执行,不再启用其他shell。
    新产生一个shell然后再执行scripts的方法是在scripts文件开头加入以下语句
    #!/bin/sh
    一般的script文件(.sh)即是这种用法。这种方法先启用新的sub-shell(新的子进程),然后在其下执行命令。
    另外一种方法就是上面说过的source命令,不再产生新的shell,而在当前shell下执行一切命令。

    source:

    source命令即点(.)命令。

    在bash下输入man source,找到source命令解释处,可以看到解释"Read and execute commands from  filename in the current shell environment and  ..."。从中可以知道,source命令是在当前进程中执行参数文件中的各个命令,而不是另起子进程(或sub-shell)。


    exec:

    在bash下输入man exec,找到exec命令解释处,可以看到有"No new process is  created."这样的解释,这就是说exec命令不产生新的子进程。那么exec与source的区别是什么呢?

    exec命令在执行时会把当前的shell  process关闭,然后换到后面的命令继续执行。

    * fork ( /directory/script.sh)
        fork是最普通的,  就是直接在脚本里面用/directory/script.sh来调用script.sh这个脚本.运行的时候开一个sub-shell执行调用的脚本,sub-shell执行的时候,  parent-shell还在。sub-shell执行完毕后返回parent-shell.  sub-shell从parent-shell继承环境变量.但是sub-shell中的环境变量不会带回parent-shell
    * source  (source /directory/script.sh)
        与fork的区别是不新开一个sub-shell来执行被调用的脚本,而是在同一个shell中执行. 所以被调用的脚本中声明的变量和环境变量,  都可以在主脚本中得到和使用.
    * exec (exec /directory/script.sh)
         exec与fork不同,不需要新开一个sub-shell来执行被调用的脚本. 被调用的脚本与父脚本在同一个shell内执行。但是使用exec调用一个新脚本以后,  父脚本中exec行之后的内容就不会再执行了。这是exec和source的区别。

  • 相关阅读:
    卡特兰数
    hdu 1023 Train Problem II
    hdu 1022 Train Problem
    hdu 1021 Fibonacci Again 找规律
    java大数模板
    gcd
    object dection资源
    Rich feature hierarchies for accurate object detection and semantic segmentation(RCNN)
    softmax sigmoid
    凸优化
  • 原文地址:https://www.cnblogs.com/wangshaowei/p/10561513.html
Copyright © 2011-2022 走看看