Shell脚本的多种执行方式解析

当shell脚本以非交互的方式运行时,它会先查找环境变量ENV,该变量指定了一个环境文件(通常是.bashrc),然后从该环境变量文件开始执行,当读取了ENV文件之后,SHELL才开始执行shell脚本中的内容。(所以全局变量可以定义在环境变量中)。通常我们写一可执行程序,在拥有可执行权限的情况下,都是采用”./exe_name”即加当前路径的方式来执行。而在shell脚本的执行中,这种方式也是可以的并且也是首先需要脚本文件的可执行权限(x权限位)。但是不仅限于这一种方式。下来我们总结一下shell的非交互式的运行方式:

命令行中Shell脚本的执行通常可以采用以下三种方式:

(1)”bash script-name”或者”sh script-name”
当脚本文件本身没有可执行权限(即x位为-号)或者文件开头没有指定解释器时的使用方法。当然有权限位和指定了解释器也可以使用该方法。
简单测试:
这里写图片描述

(2)”path/script-name”(绝对路径加脚本名)或”./script-name”(相对路径加脚本名)
如果文件无权限执行不了(要想执行必须加上x位权限)
简单测试:
这里写图片描述

可以发现在没有x权限位时,完全路径与相对路径的方式都执行不了,但是加上x权限位后,两种方式都可以执行了,对于一般的脚本看起来这种方式受权限位限制,所以第一种方式更好一些。(我们这里也没有指定命令解释器#!/bin/sh或#!/bin/bash,但是在Linux下默认是bash不用指定也是可以的,但是在其它UNIX下如果不指定命令解释器,就不一定能通过这种方式执行了)。

(3)”source script-name”或”. script-name”
使用”source”或”.”读入或者加载指定的shell脚本文件son.sh,然后依次执行shell脚本中son.sh的所有语句,这些语句将作为当前父shell脚本father.sh进程的一部分执行。因此使用”source”与”.”时,可以将son.sh自身脚本中的变量的值或函数的返回值传递到当前的父shell脚本father.sh中使用(这是第三种与前两种最大的区别)。

上面这写描述看起来相对不那么容易理解,我们举例来说明:
这里写图片描述
首先我们将pwd命令的路径赋给自定义环境变量userdir,并将赋值语句输出重定向到test.sh脚本中,通过“sh test.sh”与”bash test.sh”的方式执行脚本以后,再echo $userdir发现并没有打印pwd的结果。但是当我们以“. test.sh”的方式执行脚本以后,再echo环境变量的内容可以看到正常打印。原因何在?

解析:因为我们前面说过,”source”和“.”会将子shell的脚本内容加载传递到父shell的脚本中去,sh和bash则不会,那么test.sh为当前shell的子脚本,而当前命令窗口的shell为父shell。当我们以第一种方式执行子shell时,当前父shell不知道userdir这个环境变量,echo结果就为空。而采用”.”的方式来执行子shell执行完毕后,userdir环境变量在父shell中已经被加载传递进来,所以echo可以看到userdir变量的值。这也就是”.”与”source”的重要的用法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值