您的位置:首页 > 运维架构 > Linux

Linux脚本的执行方式解析

2017-06-08 00:57 190 查看
我们经常使用多种方式运行脚本的方法,那他们的原理是什么呢?



先在/root写一个脚本:

vim hello.sh

#!/bin/bash
cd /tmp
echo"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有疑问,尝试如下例子:

新建一个test.sh脚本,内容为:A=1

然后使其可执行chmod +x test.sh

运行sh test.sh后,echo $A,显示为空,因为A=1并未传回给当前shell

运行./test.sh后,也是一样的效果

运行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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  脚本 linux bash