1.系统合法的shell和/etc/shells的功能
1.1.查看当前系统有多少我们可以使用的合法的shell
linux可以使用的合法的shell可以查看/etc/shells这个文件
[root@bogon etc]# cat /etc/shells /bin/sh (已经被/bin/bash所替代) /bin/bash(linux默认的shell) /sbin/nologin /bin/dash /bin/tcsh /bin/csh
1.2.查看当前用户默认取得的shell,查看/etc/passwd这个文件,如下所示
[root@bogon etc]# cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync
如上所示,在每一行的最后一个数据,就是你登录后可以取得的默认的shell.
2.bash shell 的内置命令:type
为了方便shell的操作,其实bash已经”内置“了很多的命令,例如cd、umask等命令,都是内置在bash当中的。
那我们怎么知道这个命令是来自外部命令(指的是其他非bash所提供的命令)还是内置在bash当中的呢?利用type这个命令来查看即可,使用如下:
type [-tpa] name 参数: type:不加任何参数是,type会显示出name是外部命令还是bash内置命令 -t :当加入-t时,type会将name以下面这些字眼显示出它的意义: file:表示为外部命令; alias:表示该命令为命令别名所设置的名称; builtin:表示该命令为bash的内置命令 -p :如果后面接的name为外部命令是,才会显示完整文件名 -a :会由PATH变量定义的路径中,将所有含name的命令都列出来,包含alias 实例一:查询ls这个命令是否为bash的内置命令 [root@bogon etc]# type ls ls is aliased to `ls --color=auto' ==》可以看出ls是一个命令别名 [root@bogon etc]# type -t ls alias ==》精简方式列出 [root@bogon etc]# type -a ls ls is aliased to `ls --color=auto' ls is /bin/ls ==》列出这个命令所在是文件 [root@bogon etc]# type -t cd builtin ==》cd 是bash的一个内置命令
3.shell的变量功能
3.1.变量的显示与设置:echo,unset
变量的显示:echo
[root@bogon etc]# echo $JAVA_HOME /usr/java/jdk1.7.0_55 [root@bogon etc]# echo ${JAVA_HOME} /usr/java/jdk1.7.0_55
3.2.设置变量或者修改变量
设置变量和修改变量是如此的简单,就是用等号(=)连接变量就ok了,例如:
[root@bogon etc]# myname=ickes [root@bogon etc]# echo $myname ickes
变量的设置规则需要注意的地方
1.等号两边不能直接接空格,如下面就是错误的
[root@bogon etc]# myname= ickes bash: ickes: command not found
2.变量名称只能为字母和数字,但是开头不能为数字
3.变量内容若有空格可以使用双引号(")或者单引号(')将变量内容结合起来,但是注意了
双引号里面的特殊字符如$等,可以保有原本的特性,如下所示
[root@bogon etc]# test="lang is $LANG" [root@bogon etc]# echo $test lang is en_US.UTF-8
单引号内的特殊字符则为一般字符(纯文本),如下所示
[root@bogon etc]# test='lang is $LANG' [root@bogon etc]# echo $test lang is $LANG
4、可以用转义字符(\)将特殊字符$等转变为一般字符
5、在一串命令当中,如果需要其他的命令提供信息,可以使用反单引号(`命令`)或者$(命令)。反单 引号是1键左边的那个键例如要取得当前操作系统内核的版本,如下所示:
[root@bogon etc]# version=`uname -r` [root@bogon etc]# echo $version 2.6.32-358.el6.i686 [root@bogon etc]# version1=$(uname -r) [root@bogon etc]# echo $version1 2.6.32-358.el6.i686
在命令执行过程中反单引号(``)和$()这两个符号代表的含义如何?
答:在一串命令当中,在`之内的命令将会被先执行,这个命令返回的结果将会作为外部的输入信息`
6、行业规矩全部大写的变量为环境变量,自行设置的变量为小写字母,方便判断。
3.3、取消变量:unset
[root@bogon etc]# myname=ickes [root@bogon etc]# echo $myname ickes [root@bogon etc]# unset myname [root@bogon etc]# echo $myname [root@bogon etc]#
3.4、子进程
什么是子进程呢?就是说在我目前这个shell的情况下,去打开另一个新的shell,新的那个shell就是子进程。在一般的状态下,父进程的自定义变量是无法再子进程内使用的。但是通过export将变量变成环境变量后,就能够在子进程下面应用了
例如:
[root@bogon ~]# name=ickes [root@bogon ~]# bash 进入子进程 [root@bogon ~]# echo $name 在子进程中显示变量 当然没有东西,因为子进程无法引用父进程的变量 [root@bogon ~]# exit 离开子进程 exit [root@bogon ~]# export name 将name这个变量设置为环境变量 [root@bogon ~]# bash 再次进入子进程 [root@bogon ~]# echo $name 显示变量 ickes 打印出来,格叽格叽! [root@bogon ~]# exit exit
4、环境变量的功能、与查看
4.1.用evn查看环境变量,与常见环境变量的说明
env命令可以列出了当前所有的环境变量
HOME:代表当前用户的主文件夹
SHELL:他告知我们目前这个环境变量使用的shell是那个程序?linux默认使用/bin/bash
HISTSIZE:这个与”历史命令“有关,就是我们曾经执行过的命令可以被系统记录下来,而记录下来的条数,就是有这个变量来指定
MAIL:当我们使用mail这个命令在收信时系统回去读取的邮件信箱文件
PATH:执行文件的路径变量
LANG:这个重要,就是语系数据,很多信息都会用到它。
RANDOM:这是”随机数“的变量,例如如下
[root@bogon ~]# echo $RANDOM 20801系统会随机生成一个0~32767的随机数
4.2.用set查看所有变量(包含环境变量和自定义变量)
查出一堆的东西,我也没有具体用到过,用到时,在补充,博客就是好,可以随时改
4.3.export:自定义变量转成环境变量
谈了env与set现在知道有所谓的环境变量与自定义变量,两种直接有什么差异呢?
答:两者直接的差异在于,该变量是否会被子进程所继续使用。
父进程跟子进程的解释
答:当你登录linux并取得一个bash之后,你的bash就是一个独立的线程,接下来你在这个bash下面所执行的任何命令都是由你这个bash所衍生出来的,那些被执行的命令就被称为子进程了。
如图所示
如上图所示,我们在原本的bash下面执行另一个bash,结果操作的环境接口会跑到第二个bash中去(这就是子进程),那原本的bash就会处于暂停的情况(sleep).若想回到原本的bash中去,就只能结束当前的子进程(exit或者logout).
这个程序概念与变量有什么关系呢?
答:关系可大了,因为子进程仅会继承父进程的环境变量,子进程不会继承父进程的自定义变量,所以你原本bash中的自定义变量在进入子进程后就会消失不见,直到退出子进程回到父进程才能引用。
如果将自定义变量换成环境变量后,在子进程中就可以继续访问上面已经介绍过了,这里就不啰嗦了!
待续!