Linux脚本的执行方式解析

来源:互联网 发布:淘宝上苹果官方旗舰店 编辑:程序博客网 时间:2024/06/02 04:38

我们经常使用多种方式运行脚本的方法,那他们的原理是什么呢?
enter description here

先在/root写一个脚本:
vim hello.sh

#!/bin/bashcd /tmpecho"hello guys!"echo"welcome to echo_blog"

脚本可能执行出现的问题:

  • 是否加权限文件才可以执行?
  • 执行成功目录是否改变?

带着两个问题查看下面的运行方式:

bash sh方法运行:

[root@localhost ~]# bash hello.sh
hello guys!
welcome to echo_blog

[root@localhost ~]# pwd
/root

[root@localhost ~]# sh hello.sh
hello guys!
welcome to echo_blog

[root@localhost ~]# pwd
/root

运行原理:当使用bash命令去执行文件时,shell会重新建立一个子shell执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell,除非使用export,所以目录没有改变。

source . 方法执行

source命令:
source命令也称为“点命令”,也就是一个点符号(.),是bash的内部命令。

  • 功能:
    使Shell读入指定的Shell程序文件并依次执行文件中的所有语句。
    source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。

  • 用法:
    source filename 或 . filename
    source命令(从 C Shell 而来)是bash shell的内置命令;点命令(.),就是个点符号(从Bourne Shell而来)是source的另一名称。

[root@localhostz ~]# source hello.sh
hello guys!
welcome to echo_blog

[root@localhost tmp]# pwd
/tmp

[root@localhost ~]# . hello.sh
hello guys!
welcome to echo_blog

[root@localhost tmp]# pwd
/tmp

运行原理:在当前shell中,source读入指定的Shell程序文件并依次执行文件中的所有语句,并执行,因为脚本在当前shell中执行,所以目录改变。

绝对路径和相对路径执行

[root@localhost ~]# ./hello.sh
bash: ./hello.sh: Permission denied

[root@localhost ~]# /root/hello.sh
bash: /root/hello.sh: Permission denied

[root@localhost ~]# chmod +x hello.sh #给予文件执行权限
[root@localhost ~]# ./hello.sh
hello guys!
welcome to echo_blog

[root@localhost tmp]# pwd
/tmp

在弄懂运行原理之前先看ls命令是怎么执行的:
其实ls 命令都是用文件的路径的命令运行,其路径用which查看如下:

[root@localhost ~]# which ls
alias ls=’ls –color=auto’ #命令别名
/usr/bin/ls #文件路径

也就是说当你在命令行键入ls是,shell会通过环境变量映射(或者你直接输入)的路径目录下去找可执行的文件

运行原理:当在命令行读入一行字符串时,shell会去系统的环境变量的目录下去查找相关问件或者通过路径查找并价判断它是否为可执行的文件,然后在打开一个子shell去运行文件(脚本或二进制文件ELF),所以目录没有改变。

如果对shell所产生的子shell有疑问,尝试如下例子:

  1. 新建一个test.sh脚本,内容为:A=1
  2. 然后使其可执行chmod +x test.sh
  3. 运行sh test.sh后,echo $A,显示为空,因为A=1并未传回给当前shell
  4. 运行./test.sh后,也是一样的效果
  5. 运行source test.sh 或者 . test.sh,然后echo $A,则会显示1,说明A=1的变量在当前shell中

最近折腾了一个人小站,欢迎到访
参考:
1.http://www.51testing.com/html/38/225738-206878.html
2.http://4554480.blog.51cto.com/4544480/837006

阅读全文
0 0
原创粉丝点击