码迷,mamicode.com
首页 > 系统相关 > 详细

linux杂记(十)?what is BASH Shell

时间:2015-10-12 00:21:39      阅读:399      评论:0      收藏:0      [点我收藏+]

标签:

first,what is shell?其实只要是碰过计算机的,对于OS(Operation System操作系统,不管是linux、unix、windows)有点概念的人大多都听过这个名词,因为只要有OS那么就离不开Shell。其实Shell就是将我们输入的指令与kernel(核心)的沟通,使kernel可以控制hardware硬件(例如声卡,网卡,显卡)来正确无误工作。

基本上,替我们工作的是【hardware】,控制硬件的是【kernel】,而我们user则是利用【shell】控制一些kernel通过的【utility(工具)】来操控硬件替我们正确工作。更进一步,由于kernel听不懂人类语言,而人类也没办法直接记得kernel的语言,所以两者的沟通就得由shell来支持。

 

系统的shell与/etc/shells功能

由于早年Unix年代,发展者众,所以由于shell依赖发展者的不同就有许多版本,例如Bourne SHell(sh)、在Sun里头预设的C SHell、商业上常用的K SHell、还有TCSH等等。linux使用的版本就称为【Bourne Again SHell(简称bash)】,这个shell是Bourne Shell增强版,也是基准于GNU的架构下发展出来的。

那么目前我们linux有多少我们可以使用的shells?check一下/etc/shells这个档案,至少就有底下这几个可以用的shells:

/bin/sh (已经被 /bin/bash 所取代)
/bin/bash (就是 Linux 预设的 shell)

为什么我们系统上的 shell 要写入 /etc/shells 这个档案啊? 这是因为系统某些服务在运行过程中, 会去检查使用者能够使用的 shells ,而这些 shell 的查询就是藉由 /etc/shells 这个档案!

举例来说,某些 FTP 网站会去检查使用者的可用 shell ,而如果你不想要让这些使用者使用 FTP 以外的主机资源时,可能会给予该使用者一些怪怪的 shell,让使用者无法以其它服务登入主机。 这个时候,你就得将那些怪怪的 shell 写到 /etc/shells 当中了。举例来说,我们的 FC4 的 /etc/shells 里头就有
个 /sbin/nologin 档案的存在,这个就是我们说的怪怪的 shell了。

 

Bash shell的功能

  • 命令编修能力(类似DOS的doskey功能)

使用bash里头相当nice的一个功能就是【能记忆使用过的指令】,只要在指令列使用【上下键】就可以找到前一个输入的指令。在很多distribution里头,预设的指令记忆功能就可以达1000个。记录的档案就在你的HOME目录内的.bash_history里。不过,~/.bash_history记录的是前一次登入以前所执行过的指令,而至于这一次登入所执行的指令都被暂存在内存中,当你成功注销系统后,该指令记忆才会记录到.bash_history当中。

这最大的好处就是可以【查询曾经做过的举动】,以作为除错工具。但如果被黑客入侵,那么他只要翻你曾经执行过的指令,而刚好你的指令又跟系统有关(如直接输入MySQL的密码在指令列上面),那么就很容易破解你的linux主机。所以最好是将记录的指令数目减小一点。

  • 命令与档案补全功能

[tab]按键的功能是bash里头特有的,常常在bash环境中使用[tab]是个很好的习惯,因为让你少打很多字,而且确定输入的数据是正确的。

  • 命令别名(alias)设定功能

如果我需要知道这个目录底下所有档案(包含隐藏档)及所有档案属性,那么就必须下达ls -al,有没有使用自定命令lm来取代前面的命令呢?有,使用alias即可。在指令列输入alias就可以知道目前的命令别名有哪些了。也可以直接下达命令来设定别名:

alias lm=‘ls -al‘

  • 工作控制(jobs)、前景背景控制

  • Shell scripts的强大功能

在 DOS 年代还记得将一堆指令写在一起的所谓的『批次档』吧?在 Linux 底下的 shell scripts 则发挥的更为强大的功能,可以将您日常生活当中常需要下达的连续指令写成一个档案, 该档案并且可以透过对谈交互式的方式来进行主机的侦测工作!也可以藉由 shell 提供的环境变量及相关指令来进行设计,整个设计下来几乎是一个小型的程序语言。

  • 万用字符

除了完整的字符串之外, bash 还支持许多的万用字符来帮助使用者查询与指令下达。 举例来说,想要知道 /usr/X11R6/bin 底下有多少以 xt 为开头的档案吗?使用: ls -l /usr/X11R6/bin/xt* 就能够知道。

Bash shell的内建命令:type

我怎么知道这个指令是来自于外部指令(指的是其它非 bash 套件所提供的指令) 或是内建在 bash 当
中的呢? 利用 type 这个指令来观察即可!

[root@linux ~]# type [-tpa] name
参数:
 :不加任何参数时,则 type 会显示出那个 name 是外部指令还是 bash 内建的指令!
-t:当加入 -t 参数时,type 会将 name 以底下这些字眼显示出他的意义:
file :表示为外部指令;
alias :表示该指令为命令别名所设定的名称;
builtin :表示该指令为 bash 内建的指令功能;
-p :如果后面接的 name 为指令时,会显示完整文件名(外部指令)或显示为内建指令;
-a :会将由 PATH 变量定义的路径中,将所有含有 name 的指令都列出来,包含 alias

shell的变量功能

举个简单的例子来说, sendmail 的 smtp 存放 mail 路径是经由/etc/profile 里头的:MAIL="/var/spool/mail/$USER"来设定的,而当我修改了上面这一个咚咚,然后重新开机之后! 我的邮件就可以存放到不同的路径去了!而且不会有问题!可以顺利的【在 Linux 主机上面】收发。然而问题发生在 pop3这个服务上面,由于 pop3 的预设路径是在 source code 里头,而且就正是 /var/spool/mail 这个路径,也就是说,不论我怎么修正我的【变量】, pop3 都不为所动!所以就无法直接以 pop3 来收信了(例如OutLook 就不能工作了)!会发生密码不接受的问题!

再来继续讲到其它的变量功能好了,关于能不能执行某个指令, 与 PATH 这个变量也有很大的关系的。举例来说,我们在任何地方下达 ls 这个指令时,系统就是透过 PATH 这个变量里面的内容所记录的路径顺序来搜寻指令的呢!如果在搜寻完 PATH 变量内的路径还找不到 ls 这个指令时,就会在屏幕上显示『 command not found 』的错误讯息了。

那么什么是变量?变量就是以一组文字或符号等,来取代一些设定或者是一串保留的数据!

如何显示变量?使用 echo!

变量的取用与设定:echo, 变量设定规则, unset

利用 echo 这个指令来取用变量,但是,变量在被取用时,前面必须要加上$ 才行,举例来说,要知道 PATH 的内容,怎么办好?

[KANO@kelvin ~]$ echo $variable
[KANO@kelvin ~]$ echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/KANO/.local/bin:/home/KANO/bin
[KANO@kelvin ~]$ echo ${PATH}

现在我们知道了变量与变量内的之间的相关性了,那么我要如何【设定】或者是【修改】 某个
变量的内容呢?用【等号(=)】连接变量与他的内容。当一个变量名称尚未被设定时,预设的内容是【空】的。 另外,变量在设定时,还是需要符合某些规定的,否则会设定失败喔! 这些规则如下所示。

  1. 变量与变量内容以等号【=】来连结;
  2. 等号两边不能直接接空格符;
  3. 变量名称只能是英文字母与数字,但是数字不能是开头字符;
  4. 若有空格符可以使用双引号【"】或单引号【‘】来将变量内容结合起来,但必须要特别注意,双引号内的特殊字符可以保有变量特性,但是单引号内的特殊字符则仅为一般字符;
  5. 必要时需要以跳脱字符【\】来将特殊符号(如Enter,$,\,空格符,‘等)变成一般符号;
  6. 在一串指令汇总,还需要藉由其它的指令提供的信息,可以使用quote【`command`】:(注意,`是键盘上方数字键1左边那个按键,不是单引号)
  7. 若该变量为扩增变量内容时,则需以双引号及$变量名称,如【"$PATH":/home】继续累加内容;
  8. 若该变量需要在其它子程序执行,则需要以export来使变量变成环境变量,如【export PATH】;
  9. 通常大写字符为系统预设变量,自行设定变量可以使用小写字符,方便判断;
  10. 取消变量的方法:【unset 变量名称】
范例一:设定一变量 name ,且内容为 XXXX。
[root@linux ~]# 1name=XXXX
-bash: 1name=XXXX: command not found<==屏幕会显示错误!因为不能以数字开头!
[root@linux ~]# name = XXXX<==还是错误!因为有空白!
[root@linux ~]# name=XXXX <==OK
范例二:承上题,若变量内容为 XXXXs name 呢?
[root@linux ~]# name=XXXXs name
# 因为单引号可以将 Enter 这个特殊字符取消,所以,您可以继续在下一行输入内容
# 不过,这与我们要达到的功能不同,所以,算是失败的!
[root@linux ~]# name="XXXX‘s name"<==OK
[root@linux ~]# name=XXXX\s\ name
# 利用反斜线 (\) 跳脱特殊字符,例如单引号与空格键
范例三:我要在 PATH 这个变量当中『累加』:/home/dmtsai/bin 这个目录
[root@linux ~]# PATH=$PATH:/home/dmtsai/bin
[root@linux ~]# PATH="$PATH":/home/dmtsai/bin
# 上面这两种格式在 PATH 里头的设定都是 OK 的!但是底下的例子就不见得了!
范例四:呈范例三,我要将 name 的内容多出 "yes" 呢?
[root@linux ~]# name=$nameyes
# 知道了吧?如果没有双引号,那么变量成了啥?name 的内容是 $nameyes 这个变量!
# 呵呵!我们可没有设定过 nameyes 这个变量吶!所以,应该是底下这样才对!
[root@linux ~]# name="$name"yes
[root@linux ~]# name=${name}yes
范例五:如何让我刚刚设定的 name=XXXX可以用在下个 shell 的程序?
[root@linux ~]# name=XXXX
[root@linux ~]# bash <==进入到所谓的子程序
[root@linux ~]# echo $name <==并没有刚刚设定的内容
[root@linux ~]# exit <==离开刚刚的子程序
[root@linux ~]# export name
[root@linux ~]# bash <==进入到所谓的子程序
[root@linux ~]# echo $name <==出现了设定值
[root@linux ~]# exit <==离开刚刚的子程序
# 什么是【子程序】呢?就是说,在我目前这个 shell 的情况下,
# 去启用另一个新的 shell ,新的那个 shell 就是子程序啦!在一般的状态下,
# 父程序的自订变量是无法在子程序内使用的。但是透过 export 将变量变成
# 环境变量后,就能够在子程序底下应用了!
范例六:如何进入到您目前核心的模块目录?
[root@linux ~]# cd /lib/modules/`uname -r`/kernel
# 每个操作系统核心版本都不相同,以 FC4 为例,他的预设核心版本是
# 2.6.11-1.1369_FC4 所以,他的模块目录在 /lib/modules/2.6.11-1.1369_FC4/kernel 。
# 因为每个 distributions 的这个值都不相同,但是我们却可以利用 uname -r 这个指令
# 先取得版本信息,所以啰,就可以透过上面指令当中的内含指令 `uname -r`
# 先取得版本输出到 cd .. 那个指令当中,就能够顺利的进入目前核心的驱动程序所放置
# 的目录。
范例七:取消刚刚设定的 name 这个变量内容
[root@linux ~]# unset name

环境变量的功能

环境变量可以帮我们达到很多功能,包括HOME目录的变换啊、提示字符的显示啊、执行文件搜寻的路径啊等等。那么目前我的 shell 环境中, 有多少变量啊?我们可以利用两个指令来查阅,分别是 env 与 export 。

  • env
范例以:列出目前的shell环境下所有环境变量与其内容
[KANO@kelvin ~]$ env XDG_VTNR=2 XDG_SESSION_ID=2 HOSTNAME=kelvin <== 这部主机的主机名称 GIO_LAUNCHED_DESKTOP_FILE_PID=16802 IMSETTINGS_INTEGRATE_DESKTOP=yes GPG_AGENT_INFO=/run/user/1000/keyring/gpg:0:1 TERM=xterm <== 这个终端机使用的环境是什么类型 SHELL=/bin/bash <== 目前这个环境下,使用的 Shell 是哪一个程序? XDG_MENU_PREFIX=gnome- HISTSIZE=1000 <== 这个就是【记录指令的笔数】预设可记录 1000 笔 QTDIR=/usr/lib64/qt-3.3 QTINC=/usr/lib64/qt-3.3/include IMSETTINGS_MODULE=FCITX QT_GRAPHICSSYSTEM_CHECKED=1 USER=KANO <== 使用者的名称 LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:
ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=
01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.
lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;
31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.
jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.pn
g=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm
=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;
35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.o
gx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.m4a=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=0
1
;36:*.wav=01;36:*.oga=01;36:*.opus=01;36:*.spx=01;36:*.xspf=01;36: <== 一些颜色显示 DESKTOP_AUTOSTART_ID=102b42e5d3dc2ed48f144454270326433800000159530002 SSH_AUTH_SOCK=/run/user/1000/keyring/ssh SESSION_MANAGER=local/unix:@/tmp/.ICE-unix/15953,unix/unix:/tmp/.ICE-unix/15953 USERNAME=KANO GIO_LAUNCHED_DESKTOP_FILE=/home/KANO/.config/autostart/guake.desktop PATH=/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/KANO/.local/bin:/home/KANO/bin <==是执行文件指令搜寻路径 MAIL=/var/spool/mail/KANO <== 这个使用者所取用的 mailbox 位置 DESKTOP_SESSION=gnome QT_IM_MODULE=xim XDG_SESSION_TYPE=x11 PWD=/home/KANO <== 目前使用者所在的工作目录 (利用 pwd 取出!) XMODIFIERS=@im=fcitx LANG=zh_CN.UTF-8 <== 这个与语系有关 MODULEPATH=/etc/scl/modulefiles:/etc/scl/modulefiles:/usr/share/Modules/modulefiles:/etc/modulefiles:/usr/share/modulefiles GDM_LANG=zh_CN.UTF-8 LOADEDMODULES= GDMSESSION=gnome HISTCONTROL=ignoredups SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass XDG_SEAT=seat0 HOME=/home/KANO <== 这个使用者的HOME目录 SHLVL=2 GNOME_DESKTOP_SESSION_ID=this-is-deprecated XDG_SESSION_DESKTOP=gnome LOGNAME=KANO QTLIB=/usr/lib64/qt-3.3/lib CVS_RSH=ssh DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-nS4TZ10ND8,guid=7b99d27fc5c1a7bd3fc55c625619f8ed MODULESHOME=/usr/share/Modules LESSOPEN=|/usr/bin/lesspipe.sh %s WINDOWPATH=2 DISPLAY=:0 XDG_RUNTIME_DIR=/run/user/1000 GTK_IM_MODULE=fcitx XDG_CURRENT_DESKTOP=GNOME XAUTHORITY=/run/user/1000/gdm/Xauthority BASH_FUNC_module()=() { eval `/usr/bin/modulecmd bash $*` } BASH_FUNC_scl()=() { local CMD=$1; if [ "$CMD" = "load" -o "$CMD" = "unload" ]; then eval "module $@"; else /usr/bin/scl "$@"; fi } _=/usr/bin/env <== 上一次使用的指令的最后一个参数(或指令本身)

env 是 environment (环境) 的简写。上面的例子当中,是列出来所有的环境变量。当然,如果使用
export 也会是一样的内容。 只不过, export 还有其它额外的功能就是了,我们等一下再提这个 export
指令。那么上面这些变量有些什么功用呢?

HOME : 代表使用者的家目录。
SHELL : 告知我们,目前这个环境使用的 SHELL 是哪支程序? 如果是 bash 的话,预设是/bin/bash !
HISTSIZE : 这个与【历史命令】有关,即是我们曾经下达过的指令可以被系统记录下来,而记录的【笔数】则是由这个值来设定的。
ENV : 这个使用者所使用的个人化环境设定档的读取档案。
MAIL : 当我们使用 mail 这个指令在收信时,系统会去读取的邮件信箱档案 (mailbox)。
PATH : 就是执行文件搜寻的路径。目录与目录中间以冒号(:)分隔, 由于档案的搜寻是依序由 PATH 的变量内的目录来查询,所以,目录的顺序也是重要的。
LANG : 这个重要!就是语系档案。很多数据都会用到他, 举例来说,当我们在启动某些 perl的程序语言档案时,他会主动的去分析语系数据文件, 如果发现有他无法解析的编码语系,可能会产生错误!一般来说,我们中文编码通常是 zh_CN.UTF-8 或者是 zh_CN.gb2312,这两个编码偏偏不容易被解译出来,所以,有的时候,可能需要修订一下语系数据。
RANDOM : 这个玩意儿就是【随机随机数】的变量啦!目前大多数的 distributions 都会有随机数产生器,那就是 /dev/random 这个档案。 我们可以透过这个随机数档案相关的变量 ($RANDOM)来随机取得随机数值喔。在 BASH 的环境下,这个 RANDOM 变量的内容,介于 0~32767 之间,所以,你只要 echo $RANDOM 时,系统就会主动的随机取出一个介于 0~32767 的数值。万一我想要使用 0~9 之间的数值呢?利用 declare 宣告数值类型, 然后这样做就可以了:

[root@linux ~]# declare -i number=$RANDOM*10/32767 ; echo $number 
8<== 此时会随机取出 0~9 之间的数值
  • 其它所有变量说明:set

如何观察目前 shell 环境下的所有变量呢?就用 set 即可。set 这个指令除了会将环境变量列出来之外,其它我们的自订变量,与所有的变量,都会被列出来!

[root@linux ~]# set
BASH=/bin/bash<== bash 的主程序放置路径
BASH_VERSINFO=([0]="3" [1]="00" [2]="16" [3]="1" [4]="release"
[5]="i386-redhat-linux-gnu")<== bash 的版本啊!
BASH_VERSION=3.00.16(1)-release <== bash 的版本啊!
COLORS=/etc/DIR_COLORS.xterm<== 使用的颜色纪录档案
COLUMNS=115<== 在目前的终端机环境下,使用的字段有几个字符长度
HISTFILE=/root/.bash_history<== 历史命令记录的放置档案,隐藏档
HISTFILESIZE=1000 <== 存起来(与上个变量有关)的档案之指令的最大纪录笔数。
HISTSIZE=1000 <== 目前环境下,可记录的历史命令最大笔数。
HOSTTYPE=i386 <== 主机安装的软件主要类型。我们用的是 i386 兼容机器软件
IFS=$ \t\n <== 预设的分隔符
LINES=35 <== 目前的终端机下的最大行数
MACHTYPE=i386-redhat-linux-gnu<== 安装的机器类型
MAILCHECK=60 <== 与邮件有关。每 60 秒去扫瞄一次信箱有无新信!
OLDPWD=/home <== 上个工作目录。我们可以用 cd - 来取用这个变量。
OSTYPE=linux-gnu <== 操作系统的类型!
PPID=20046 <== 父程序的 PID (会在后续章节才介绍)
PROMPT_COMMAND=echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}\007"
<== 上面这个是命令提示字符!与底下也有关。
PS1=[\u@\h \W]\$ <== PS1 就厉害了。这个是命令提示字符,也就是我们常见的[root@linux ~]# 或 [dmtsai ~]$ 的设定值!可以更动的!
RANDOM=13586<== 随机数!
SUPPORTED=zh_TW.UTF-8:zh_TW:zh:en_US.UTF-8 <== 本系统所支持的语系
name=XXXX<== 刚刚设定的自订变量也可以被列出来!
$ <== 目前这个 shell 所使用的 PID
? <== 刚刚执行完指令的回传值。

一般来说,不论是否为环境变量,只要跟我们目前这个 shell 的操作接口有关的变量, 通常都会被设定为大写字符,也就是说,【基本上,在 Linux 预设的情况中,使用{大写的字母}来设定的变量一般为系统内定需要的变量】。

  • PS1:(提示字符的设定)

这是 PS1 (数字的 1 不是英文字母!),这个东西就是我们的『命令提示字符』! 当我们每次按下 [Enter] 按键去执行某个指令后,最后要再次出现提示字符时, 就会主动去读取这个变数值了。上头 PS1 内显示的是一些特殊符号,每个版本 bash 的 PSI 变量内的特殊符号可能有些许的差异, 你应该主动的以 man bash 去查询一下相关的变数。底下我列出 FC4 的环境下, 预设的 bash 的 PS1 变量内的特殊符号代表意义:

\d :代表日期,格式为 Weekday Month Date,例如 "Mon Aug 1"
\H :完整的主机名称。
\h :仅取主机名称的第一个名字。
\t :显示时间,为 24 小时格式,如: HH:MM:SS
\T :显示时间,12 小时的时间格式!
\A :显示时间,24 小时格式, HH:MM
\u :目前使用者的账号名称;
\v :BASH 的版本信息;
\w :完整的工作目录名称。家目录会以 ~ 取代;
\W :利用 basename 取得工作目录名称,所以仅会列出最后一个目录名。
\# :下达的第几个指令。
\$ :提示字符,如果是 root 时,提示字符为 # ,否则就是 $

假设我想要有类似底下的提示字符:

[root@linux /home/dmtsai 16:50 #12]#

那个 # 代表第 12 次下达的指令。 那么应该如何设定 PS1 呢?

[root@linux home]# PS1=[\u@\h \w \A #\#]\$ 
[root@linux /home 17:02 #85]#
# 看到了吗?提示字符变了!
# 如果您按下 [Enter] 后,该数字就会增加!

$:(关于本 shell 的 PID)
其实这个代表的是【目前这个 Shell 的执行绪代号】,亦即是所谓的 PID (Process ID)。想要知道我们的 shell 的 PID ,就可以: echo $$即可
?:(关于上个执行指令的回传码)
这个变数是:【上个执行的指令所回传的值】, 上面这句话的重点是【上一个指令】与【回传值】两个地方。当我们执行某些指令时, 这些指令都会回传一个执行后的代码。一般来说,如果成功的执行该指令,则会回传一个 0 值,如果执行过程发生错误,就会回传『错误代码』才对!一般就是以非为 0 的数值来取代。 我们以底下的例子来看看:

[root@linux ~]# echo $SHELL
/bin/bash
[root@linux ~]# echo $?
0
# 因为上个指令执行过程中,并没有错误,为成功的执行完毕,所以回传 0 。
[root@linux ~]# 12name=XXXX-bash: 12name=XXXX: command not found
[root@linux ~]# echo $?
127
# 发生错误啦!所以 echo $? 时,就会出现错误的代码!
# 我们可以利用这个代码来搜寻错误的原因
[root@linux ~]# echo $?
0
# 咦!怎么又变成正确了?这是因为 "?" 只与『上一个执行指令』有关,
# 所以,我们上一个指令是执行『 echo $? 』,当然没有错误,所以是 0 没错!

OSTYPE, HOSTTYPE, MACHTYPE:(主机硬件与核心的等级)

linux杂记(十)?what is BASH Shell

标签:

原文地址:http://www.cnblogs.com/XBlack/p/4870355.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!