Shell 中包含脚本可以使用,一个Linux系统中有多少

作者: 操作系统  发布:2019-11-09

Bash 的若干基本问题

●Shell文件包含


像其他语言一样,Shell 也可以包含外部脚本,将外部脚本的内容合并到当前脚本。

 

 

这里介绍一些bash启动前、后的问题,以及一些使用bash需要注意的基本问题。

Shell 中包含脚本可以使用:

 

. filename

 

1、Bash的介绍

source filename

=========== 

两种方式的效果相同,简单起见,一般使用点号(.),但是注意点号(.)和文件名中间有一空格。

Bash是一种Shell程序,它是一般的Linux系统中的默认的Shell程序,一般情况下Bash指的是/bin/bash这个软件。

 

一个Linux系统中有多少个可用的Shell程序,可以从/etc/shells文件中查出来。

例如,创建两个脚本,一个是被调用脚本 subscript.sh,内容如下:

当前登录用户的默认Shell是哪一个,可以从/etc/passwd文件中与此用户对应的那一行最后一个字段看出来。或者也可以通过echo $SHELL来查看。

url=""

 

一个是主文件 main.sh,内容如下:

2、内部命令与外部命令

#!/bin/bash

==================== 

. ./subscript.sh

Bash中可用的命令分为两类,分别是:内部命令和外部命令。内部命令是Bash的一部分,而外部命令都是一个一个独立于Bash的软件。

echo $url

 

 

在bash的用户提示符下,可以输入内部命令和外部命令,然后bash会分析命令,之后执行命令。bash执行内部命令不会产生新的进程,而在执行外部命令的时候,bash会用fork函数生成一个新的进程,然后用exec函数来加载这个外部命令的程序来执行这个外部命令。

执行脚本:

 

$chomd +x main.sh

怎么来区分一个命令是内部命令还是外部命令呢?用type命令来区分。type本身是一个内部命令,type commandName可以知道commandName这条命令的是内部命令还是外部命令。

./main.sh

 

http:// www.oschina.net/

3、环境变量与用户自定义变量

$

=====================

注意:被包含脚本不需要有执行权限。

环境变量是对所有的进程(包括bash的进程和非bash的进程)都可见的变量,一般用大写字母的组合作为变量名,所以也称为全局变量。

 

 

1、source命令用法:

名词解析:临时环境变量和永久环境变量。其实全局变量都是通过export导出的变量。

    source FileName

临时全局变量是在bash的命令提示符下或者bash scripts下用export导出的变量,这些变量在机器重启之后会消失,除非再次执行export命令或者再次执行相应的scripts。

    作用:在当前bash环境下读取并执行FileName中的命令。该filename文件可以无"执行权限"

永久环境变量是写在配置文件中的,这些配置文件在每次重启机器甚至重开一个bash的时候都会被再执行一次,所以这些文件中的全局变量一直存在,不会因为重启机器而消失,看上去好像是永久的,其实是每次都重新export了。

    注:该命令通常用命令“.”来替代。

 

    如:source .bash_profile

用户自定义变量是对单个Bash可见的变量,其他任何从拥有这个变量的Bash生成的子进程(包括子bash进程和其他的子进程)都看不到这个变量,所以也称为局部变量。

        . .bash_profile两者等效。

 

    source(或点)命令通常用于重新执行刚修改的初始化文档。

环境变量和用户自定义变量的主要区别是:环境变量会被bash启动的子进程继承,而自定义变量不会被bash的子进程继承。

    source命令(从 C Shell 而来)是bash shell的内置命令。

 

    点命令,就是个点符号,(从Bourne Shell而来)。

系统中的环境变量,可以用env命令和export命令来查看。在bash的命令提示符下直接输入env或者export都将列出系统的所有环境变量。

 

在bash下输入set命令既可以看到系统的环境变量,也可以看到此bash所拥有的用户自定义变量,另外列出的变量中还有一些是与bash的操作接口有关的变量。

2、./的命令用法:

 

     ./FileName

4、shell scripts的执行方式

     作用:打开一个子shell来读取并执行FileName中命令。

=======================

 

bash脚本程序的执行方式,一种是由本bash来分析scripts,然后执行,第二种是另外启动一个新的bash进程,由新bash进程来分析和执行scripts。

     注:运行一个shell脚本时会启动另一个命令解释器.

在本bash中分析和执行scripts的做法,用source命令或者点命令来执行:

         每个shell脚本有效地运行在父shell(parent shell)的一个子进程里.

[zzl@myhost Scripts]$ source test.sh

            这个父shell是指在一个控制终端或在一个xterm窗口中给你命令指示符的进程.

[zzl@myhost Scripts]$ . test.sh

         shell脚本也可以启动他自已的子进程.

 

            这些子shell(即子进程)使脚本并行地,有效率地地同时运行脚本内的多个子任务.

另起一个bash进程执行,有两种方式:

 

[zzl@myhost Scripts]$ bash test.sh

3、sh和bash命令用法:

 

     sh FileName

[zzl@myhost Scripts]$ chmod a+x test.sh (这里需要在test.sh的开头要用shebang注明将要使用的shell)

     bash FileName

[zzl@myhost Scripts]$ ./test.sh

     作用:在当前bash环境下读取并执行FileName中的命令。该filename文件可以无"执行权限"

 

     注:两者在执行文件时的不同,是分别用自己的shell来跑文件。

5、Bash下的单个命令的交互执行过程

9159金沙官网, 

=============================

   sh使用“-n”选项进行shell脚本的语法检查,使用“-x”选项实现shell脚本逐条语句的跟踪,

用户在bash的命令提示符下输入一条命令,bash就解释执行一条,这种方式成为交互式。

   可以巧妙地利用shell的内置变量增强“-x”选项的输出信息等。

交互式的情况下内部命令的执行:用户输入了一条内部命令之后,bash分析命令,直接执行。执行内部命令相当于执行bash的一个函数。

 

交互式的情况下外部命令的执行:用户在命令行输入一条命令后,bash会分析这条命令的合法性,之后会fork出一个新进程,并在新进程中exec这条命令的程序。

没有被export导出的变量(即非环境变量)是不能被子shell继承的

 

[root@localhost ~]#name=chahu       //定义一般变量 

6、shell scripts的执行过程

[root@localhost ~]# echo ${name} 

=====================

chahu 

bash中scripts的执行过程与执行方式有关系。当用source或者点命令时是由本bash来执行此scripts的,如果是由bash命令或者直接执行脚本,则是另起一个子bash进程来执行scripts的。

[root@localhost ~]# cat test.sh      //验证脚本,实例化标题中的./*.sh 

 

#!/bin/sh 

那么一个bash进程或者bash的子进程又是怎么执行scripts的呢?

echo ${name} 

[zzl@myhost Scripts]$ source test.sh

[root@localhost ~]# ls -l test.sh    //验证脚本可执行 

这条命令执行后,当前bash会把test.sh当成一个命令行参数读入,之后从test.sh中读取一条、分析一条、执行一条,直至全部执行完毕。

-rwxr-xr-x 1 root root 23 Feb  6 11:09 test.sh 

 

[root@localhost ~]# ./test.sh        //以下三个命令证明了结论一 

[zzl@myhost Scripts]$ bash test.sh

 

这条命令执行后,当前bash会另外启动一个子bash进程,子bash把test.sh当成自己的命令行参数读入。

[root@localhost ~]# sh ./test.sh 

之后,子bash会从test.sh中读取一条,分析一条,执行一条。在这个过程中,如果读取的是内部命令,直接调用自己的对应函数;如果读取的是一个外部命令,那么它会fork一个子进程,然后在子进程中exec这个外部命令的程序,执行它。

 

直到test.sh中所有的命令都执行完了,子bash会结束,返回到当前bash中。

[root@localhost ~]# bash ./test.sh 

 

 

7、Bash的操作环境

[root@localhost ~]# . ./test.sh     //以下两个命令证明了结论二 

===================

chahu 

登录系统前的欢迎信息放在/etc/issue中、登录后想要显示的信息放在/etc/motd中。

[root@localhost ~]# source ./test.sh 

 

chahu 

login shell:在进入bash的时候,经过了完整的输入用户名和密码的登录过程,之后才进入bash,那么这个bash叫做login shell。

[root@localhost ~]# 

 

 

non login shell:在进入bash的时候,不需要经过登录过程,那么这个bash就是non login bash。比如,在X Window下,打开一个terminal终端,之后进入的bash,就是non login shell;又不如,在命令提示符下输入bash,之后进入的bash也是non login shell。

shell变量包括两种变量
1.本shell私有的变量:通过赋值语句定义好的变量,可以通过如下方法定义shell变量
   A1="1234"
   delcare A2="2345"
2.用户的环境变量:通过export语法导出的shell私有变量,可以通过如下方法导出用户环境变量
   A1="1234"
   export A1 #先定义再导出
   export A3="34"
导出成的用户环境变量可以在所有的shell中看到

 

 

login shell在进入之前要读取/etc/profile、~/.bash_profile或~/.bash_login或~/.profile等配置文件,而在~/.bash_profile中又会执行~/.bashrc文件。

set env export的区别:

non login shell在进入之前只会读取~/.bashrc文件。

set:显示(设置)shell变量 包括的私有变量以及用户变量,不同类的shell有不同的私有变量 bash,ksh,csh每中shell私有变量都不一样

 

 

login shell在注销退出的时候会读取~/.bash_logout配置文件的内容,而non login shell则不会读取。

env:显示(设置)用户变量变量

 

 

~/.bash_history文件记录了上次及以前的会话中login shell使用过的命令。

export:显示(设置)当前导出成用户变量的shell变量。

 

 

 

举个例子来讲:

以上基本问题搞清楚了,bash的使用过程中很多问题就清楚了。余下的问题是Bash内的问题,就是怎么学习bash脚本编程的问题和各个命令的用法问题了。

[root@localhost ~]$ aaa=bbb --shell变量设定

 

[root@localhost ~]$ echo $aaa

 

bbb

参考资料

[root@localhost ~]$ env| grep aaa --设置完当前用户变量并没有

1、《鸟哥Linux私房菜》()

[root@localhost ~]$ set| grep aaa --shell变量有

2、《Linux C编程一站式学习》()

aaa=bbb

[root@localhost ~]$ export| grep aaa --这个指的export也没导出,导出变量也没有

[root@localhost ~]$ export aaa --那么用export 导出一下

[root@localhost ~]$ env| grep aaa --发现用户变量内存在了

aaa=bbb

总结:linux 分 shell变量(set),用户变量(env), shell变量包含用户变量,export是一种命令工具,是显示那些通过export命令把shell变量中包含的用户变量导入给用户变量的那些变量.

 

环境变量的配置文件

最根本的设置、更改变量的配置文件 ~/.bash_profile ~/.bashrc ~/.bash_logout

~/.bash_profile 用户登录时被读取,其中包含的命令被执行

~/.bashrc 启动新的shell时被读取,并执行

~/.bash_logout shell 登录退出时被读取

 

.bashrc和.bash_profile的区别

引自.bash_profile会用在login shell .bashrc 使用在interactive non-login shell

Bash下每个用户都可以配置两个初始文件:.bash_profile和.bashrc,文件存储在~根目录中。man bash中的相关解释如下:

,---------------------------------------------------------------------------- | ~/.bash_profile | The personal initialization file, executed for login shells | ~/.bashrc | The individual per-interactive-shell startup file `----------------------------------------------------------------------------

每次bash作为login shell启动时会执行.bash_profile。

每次bash作为普通的交互shell(interactive shell)启动时会执行.bashrc

注意 1)在shell脚本中“#!/usr/bin/bash”启动的bash并不执行.bashrc。因为这里的bash不是interactive shell。

2)bash作为login shell(login bash)启动时并不执行.bashrc。虽然该shell也是interactive shell,但它不是普通的shell。

一般.bash_profile里都会调用.bashrc

尽管login bash启动时不会自动执行.bashrc,惯例上会在.bash_profile中显式调用.bashrc。所以在你的.bash_profile文件中,很可能会看到如下的代码片段: [plain] view plaincopy在CODE上查看代码片派生到我的代码片 if [ -f ~/.bashrc ]; then

. ~/.bashrc

fi

.bashrc 使用在interactive non-login shell。意思是你每次运行一个bash脚本的话,.bashrc就会被执行一次。有个简单的方法,你在.bash_profile和.bashrc里 都用echo打印点东西。,就可以看到着两个文件都是什么时候被执行的了。

编辑/etc/profile修改全局环境变量 编辑.bash_profile修改当前用户的环境变量 修改完成之后source一下即可生效,例如source ~/.bash_profile

ps: 常会看到xxxrc ——以“rc”结尾的配置文件。“rc”好像是“Runtime Command”的意思。

 

shell的嵌入命令:

: 空,永远返回为true

.   从当前shell中执行操作

break 退出for、while、until或case语句

cd 改变到当前目录

continue 执行循环的下一步

echo 反馈信息到标准输出

eval 读取参数,执行结果命令

exec 执行命令,但不在当前shell

exit 退出当前shell

export 导出变量,使当前shell可利用它

pwd 显示当前目录

read 从标准输入读取一行文本

readonly 使变量只读

return 退出函数并带有返回值

set 控制各种参数到标准输出的显示

shift 命令行参数向左偏移一个

test 评估条件表达式

times 显示shell运行过程的用户和系统时间

trap 当捕获信号时运行指定命令

ulimit 显示或设置shell资源

umask 显示或设置缺省文件创建模式

unset 从shell内存中删除变量或函数

wait 等待直到子进程运行完毕

 

 

本文由9159.com发布于操作系统,转载请注明出处:Shell 中包含脚本可以使用,一个Linux系统中有多少

关键词:

上一篇:没有了
下一篇:没有了