linux里source、sh、bash、./有什么区别(转)

add by zhj: 主要不同是,source是在当前shell中执行脚本,而sh, bash, ./是在当前shell的child shell中执行脚本

原文:http://www.cnblogs.com/pcat/p/5467188.html

在linux里,source、sh、bash、./都可以执行shell script文件,那它们有什么不同吗?

-----------

1、source

source a.sh

当前shell内去读取、执行a.sh,而a.sh不需要有"执行权限"

source命令可以简写为"."

. a.sh

注意:中间是有空格的。

2、sh/bash

sh a.sh
bash a.sh

都是打开一个subshell去读取、执行a.sh,而a.sh不需要有"执行权限"

通常在subshell里运行的脚本里设置变量,不会影响到父shell的。

3、./

./a.sh
#bash: ./a.sh: 权限不够
chmod +x a.sh
./a.sh

打开一个subshell去读取、执行a.sh,但a.sh需要有"执行权限"

可以用chmod +x添加执行权限

4、fork、source、exec

  • 使用fork方式运行script时, 就是让shell(parent process)产生一个child process去执行该script,当child process结束后,会返回parent process,但parent process的环境是不会因child process的改变而改变的。
  • 使用source方式运行script时, 就是让script在当前process内执行, 而不是产生一个child process来执行。由于所有执行结果均于当前process内完成,若script的环境有所改变, 当然也会改变当前process环境了。
  • 使用exec方式运行script时, 它和source一样,也是让script在当前process内执行,但是process内的原代码剩下部分将被终止。同样,process内的环境随script改变而改变。

通常如果我们执行时,都是默认为fork的。

为了实践下,我们可以先建立2个sh文件,以下代码来自ChinaUnix的網中人

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 ;;
    *)
        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"

自己运行下,观看结果吧 :)

chmod +x 1.sh
chmod +x 2.sh
./1.sh fork
./1.sh source
./1.sh exec
时间: 2024-12-25 11:58:11

linux里source、sh、bash、./有什么区别(转)的相关文章

Linux里startup.sh 和 shutdown.sh

最近用socket编写了一个服务端程序,监听1024端口,检测客户端发来的请求,所在Linux里写启动和停止的脚本: 在Eclipse里java写好程序,右击导出生成 Runnable JAR file 然后socketServer.jar上传到服务器即可. 1.启动 startup.sh # ---------------------------------------------------- # Start script for the Socekt Server # ----------

linux里source、sh、bash、./有什么区别

https://www.cnblogs.com/pcat/p/5467188.html source  .  这两个是一样的 .在当前shell运行脚本.脚本不需要 执行权限. sh 在子shell运行脚本.脚本不需要 执行权限. ./ 在子shell运行脚本,脚本需要 执行权限(x) 原文地址:https://www.cnblogs.com/654321cc/p/9333395.html

linux里grep和egrep,fgrep的区别

https://blog.csdn.net/xiaoxinyu316/article/details/46729443 例子:1. :格式: grep [option] pattern filename 注意: pattern如果是表达式或者超过两个单词的, 需要用引号引用. 可以是单引号也可双引号, 区别是单引号无法引用变量而双引号可以. grep '\<Tom\>' file   包含单词Tom的行grep 'Tom savage' file 包含Tom savage的行grep '^To

Linux下sh/bash/source/.命令的区别(转)

一..sh文件介绍 .sh为Linux的脚本文件,我们可以通过.sh执行一些命令,可以理解为windows的.bat批处理文件. 二.点命令(.) .命令和source是同一个命令,可以理解为source的缩写,简称点命令. 三.sh/base/source/.命令执行.sh文件的区别 假如有一个文件test.sh,脚本内容如下 #!/bin/bash echo "step 1 sleeping" sleep 200 echo "step 2 sleeping" s

shell 脚本各种执行方式(source ./*.sh, . ./*.sh, ./*.sh)的区别

结论一: ./*.sh的执行方式等价于sh ./*.sh或者bash ./*.sh,此三种执行脚本的方式都是重新启动一个子shell,在子shell中执行此脚本. 结论二: .source ./*.sh和 . ./*.sh的执行方式是等价的,即两种执行方式都是在当前shell进程中执行此脚本,而不是重新启动一个shell 而在子shell进程中执行此脚本. 验证依据:没有被export导出的变量(即非环境变量)是不能被子shell继承的 验证结果: [[email protected] ~]#n

说说shell脚本中的export 和 source,bash

小弟刚刚接触linux,对linux上的很多东西都比较陌生,所以写一写博客,当做自己工作的总结和技术的积累吧,也是鞭策自己不断努力的去学习. 今天之所以起这个标题,把export,source ,bash这三个命令放在一起讲,实在是因为自己做了一件蠢事. 什么样的蠢事先不说.先分析下这三个命令. 首先是export命令. 1.export命令 Linux export命令用于设置或显示环境变量. 在shell中执行程序时,shell会提供一组环境变量.export可新增,修改或删除环境变量,供后

linux 里 /etc/passwd 、/etc/shadow和/etc/group 文件内容解释

•/etc/passwd文件用于存放用户账户信息,每行代表一个账户,每个账户的各项信息用冒号分割,例如: root:x:0:0:root:/root:/bin/bash username:password:uid:gid:allname:homedir:shell 1.用户名. 2.密码,“x”代表密码存储在/etc/shadow中:当该值为其他任意非“x”值时,可以通过root用户切换(不需要密码),但是都无法通过非root用户切换到相应用户,因为无法获得起密码了. 3.uid,用户id,0-

Linux 第17天 bash,find,正则,命令历史

Linux 第17天 时间: 20180803 目录 脚本测试 $-变量作用 bash的配置文件 忘记的内容回顾 命令历史 命令历史调用 bash算术运算help let 管道重定向 正则表达式和扩展表达式元字符 find命令的使用 脚本测试 [ X"$var = X"$var" ] 此种方式可以避免变量出现空值时提示语法错误 [ "$name" = "$test"] 此种方式也是为了避免变量出现空值,但是如果两个变量都空时会为真 [[

source $0 &amp; bash $0

bash file.sh这种形式启动时,$0才被设置成文件名. source是bash的内建命令,把文件读取到当前bash中执行,相当于在当前bash手动输入命令,所以$0是bash. 示例代码如下: a.sh echo "in a.sh. \$0 is: $0" b.sh echo "in b.sh. \$0 is: $0" . ./a.sh 运行如下: lxw ~$ echo $0 bash lxw ~$ source a.sh in a.sh. $0 is: