计算机硬件是由内核(kernel)管理的。我们能通过shell,KDE或者应用程序和内核通信,好让内核可以控制硬件来完成我们的工作。能够操作应用程序的接口都可以成为shell。shell是linux的任督二脉。只要打通了这二脉,任何武功都能随你运用了。
shell版本众多。有sh,csh等。你可以vim /etc/shells,瞧瞧当前你的linux有多少个可以使用的shell。linux默认是/bin/bash。当我们登入的时候,系统就会给我们一个shell,让我们来工作。而这个shell会记录在/etc/passwd文件内。你可以cat /etc/passwd。瞧瞧系统给你的shell是何方神圣。
我们可以通过tpye来查看bash的内置命令,如:type cd。在bash环境下,如果命令串太长,我们可以使用\,来转义回车键,借用两行来输出。如果我们经常需要知道所有文件及其属性,每次执行ls -al,会觉得有点麻烦,这时,我们可以使用别名,如:alias lm=‘ls -al’。你也可以vim .bash_history,查询曾经做过的操作,至于这一次则会被缓存。
变量是任何一门语言的“皇冠”。比如,y=ax+b。y就是变量,ax+b就是变量的内容。管理账号的时候,腾讯会建立一个变量y。当你申请QQ的时候,此时的x就取你。我们可用“echo $变量名”来显示变量的内容。在设置变量的时候,可借用双引号或单引号来控制,单引号与双引号必须成对。若是单引号,则其内的特殊字符仅为一般字符;若是双引号,则其内的特殊字符,如$,可以保有原本的特性。如,var=“lang is $LANG",则echo $var,可得 lang is en_US。若该变量要增加内容,则可以PATH="$PATH":/home/bin/think。若该变量需要在其他子程序执行,则需要export来使变量变成环境变量:export PATH.通常,大写字符为系统默认变量,用户变量可用小写。我们可以用"unset 变量"来取消变量的设置。
练习题:假设你定义了一个变量name=think,现在想以name这个变量的内容来定义出myname显示think is my English name这个内容,要如何设置呢?
- [root@localhost ~]# name=think
- [root@localhost ~]# echo $name
- think
- [root@localhost ~]# myname="$name is my English name"
- [root@localhost ~]# echo $myname
- think is my English name
练习题:如果你有一个常去的工作目录名称为"/u01/app/oracle/product/10.2.0/db_1/sqlplus/admin/",请问该如何简化?
- work="/u01/app/oracle/product/10.2.0/db_1/sqlplus/admin/"
- cd $work
- 同时,我们可以把这个变量写进.bash_profile里面,让你每次只要cd $work便可。
在命令执行过程中,反单引号(`)之内的命令将会被先执行,而其执行出的结果将作为外部的输入信息。比如,cd /lib/modules/`uname -r`/kernel,进入你目前内核所在的模块目录。因为,反单引号容易出错,所以,通常我们会使用$(uname -r)来等价替代。
环境变量可以帮我们达到很多功能,包括主文件夹的变换,提示符的显示,执行文件查找的路径等。我们可以用env瞧瞧oracle用户的所有环境变量与其内容。
- [oracle@localhost ~]$ env
- HOSTNAME=localhost.localdomain
- SHELL=/bin/bash
- TERM=xterm
- HISTSIZE=1000
- NLS_LANG=american_america.AL32UTF8
- USER=oracle
- CLASS_PATH=/u01/app/oracle/product/10.2.0/db_1/JRE:/u01/app/oracle/product/10.2.0/db_1/jlib:/u01/app/oracle/product/10.2.0/db_1/rdbms/jlib:/u01/app/oracle/product/10.2.0/db_1/network/jlib
- LD_LIBRARY_PATH=/u01/app/oracle/product/10.2.0/db_1/lib:/usr/lib:/usr/X11R6/lib:/u01/app/oracle/product/10.2.0/db_1/jdk/jre/lib/i386:/u01/app/oracle/product/10.2.0/db_1/jdk/jre/lib/i386/server:/u01/app/oracle/product/10.2.0/db_1/rdbms/lib
- LS_COLORS=no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=00;32:*.bat=00;32:*.sh=00;32:*.csh=00;32:*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz=00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.bz=00;31:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00;35:*.xpm=00;35:*.png=00;35:*.tif=00;35:
- ORACLE_SID=orcl
- ORACLE_BASE=/u01/app/oracle
- TNS_ADMIN=/u01/app/oracle/product/10.2.0/db_1/network/admin
- MAIL=/var/spool/mail/oracle
- PATH=/u01/app/oracle/product/10.2.0/db_1/bin:/u01/app/oracle/product/10.2.0/db_1/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/oracle/bin
- INPUTRC=/etc/inputrc
- PWD=/home/oracle
- EDITOR=vi
- LANG=en_US
- ORACLE_TERM=xterm
- SQLPATH=/u01/app/oracle/product/10.2.0/db_1/sqlplus/admin
- SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
- SHLVL=1
- HOME=/home/oracle
- LOGNAME=oracle
- CVS_RSH=ssh
- LESSOPEN=|/usr/bin/lesspipe.sh %s
- DISPLAY=:0.0
- ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1
- G_BROKEN_FILENAMES=1
- _=/bin/env
那么上面这些变量有些什么功能呢?下面我们挑几个来分析一下.
HOME:代表用户的主文件夹。cd就是使用这个变量的。
SHELL:告诉我们目前这个环境使用的shell是哪个程序。linux默认使用/bin/bash.
HISTSIZE:我们曾经执行过的命令可以被系统记忆,而记录的条数,则是由这个值来设置的。
PATH:查找可执行文件的路径,目录与目录中间以冒号分隔,目录的顺序也是文件的查找顺序。
LANG:语系数据。你可以用locale -a来查看你的系统所支持的语系有哪些。但其实你只要设置LANG,则其他的语系变量就会被他所替代。系统默认的语系,你可以cat /etc/sysconfig/i18n来看。无论如何,如果发生一些乱码问题,那么请设置LANG.
再来看三个变量。
PS1:借助变量PS1,我们可以定制自己喜欢的bash环境的提示符的显示。http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=2124620,这个链接可以设置成彩色的tty。
$ :当前shell的进程号。你可以echo $$
?:表示上一个命令的回传值。一般,如果命令成功执行,则会回传一个0;如果失败,则回传一个非0的随机数。
环境变量(相当于全局变量)和自定义变量(相当于自定义变量)的差别在于,子进程仅会继承父进程的环境变量,而不会继承父进程的自定义变量。如果我们把自定义变量转成环境变量,那该变量就可以继续在子进程中存在了。这个任务由export完成。export 变量名称。那么这个变量就变成了环境变量。