当你在进行登录时,系统会检查的文档:1. /etc/profile:首先,系统会检查这个文件,以定义如下这些变量:PATH、USER、LOGNAME、MAIL、HOSTNAME、HISTSIZE、INPUTRC。还指定了 umask 和 ulimit 的设定,ulimit是用来限制一个 shell 能建立的进程数量,以避免系统资源被无限制的消耗。最后,它还会检查并执行 /etc/profile.d/*.sh 那些 script,有兴趣的话可以追踪看看。2. ~/.bash_profile:定义 USERNAME、BASH_ENV、PATH。其中的 PATH 除了现有的 $PATH 之外,还会再加入使用者相关的路径,你会发现 root 和普通帐号的路径是不一样的;而 BASH_ENV 呢,仔细点看,是下一个要检查的文档:3. ~/.bashrc: 首先是alias (别名)设定。然后有一行:. /etc/bashrc 。在 shell script 中,用一个小数点后跟一个空格再指向另外一个 script,意思是同时执行那个 script 并采用那里的变数设定。4. /etc/bashrc:基本上,这里的设定,是所有使用者在获得 shell 的时候都会采用的。这里指定了一些 terminal 设定,以及 shell 提示字符等等。5. ~/.bash_login:如果 ~/.bash_profile 不存在,则使用这个文档。6. ~/.profile:如果 ~/.bash_profile 和 ~/.bash_login 都不存在,则使用这个文档。7. ~/.bash_logout:这个文档通常只有一个命令:clear,也就是把屏幕显示的内容清掉。如果要在登出 shell 的时候,执行一些动作,例如:清空临时文档(假如你使用了临时文档)、还原某些设定、或是执行某些备份之类的。你可以通过修改上面这些文件,来调整你进入shell后的变数值。一般使用者可以修改其家目录( ~/ )中的文件,以进行个人化的设定;而作为 root,你可以修改 /etc/下面的文件,设定大家共用的变数值。至於 bash 的变数值如何设定?有哪些变数?各变数的功能如何?你可以执行 man bash 参考手册资料。Tips:一旦修改了 /etc/profile 或 ~/.bash_profile 文件,其新设定要在下次登录的时候才生效。如果你不想退出,又想使用新设定,那可以用 source 命令来抓取:source ~/.bash_profilebash的初步:一、shell 命令的格式如下:$ 命令 [选项] [参数]选项是包括一个或多个字母的代码,前面必有一个“-”号(“-”区别选项与参数),选项可以用于改变命令执行动作的类型。具体见下例二、bash配置文件[akaedu@akaedu ~]$ ls .bash*.bash_history  .bash_logout  .bash_profile  .bashrc*.bash_history记录了用户以前输入的命令*.bash_logout 退出shell时要用的命令*.bash_profile 登录Bash时要执行的命令,以及配置的Bash环境变量。*.bashrc 每次打开新的Bash时,要执行的命令,以及配置的Bash环境变量。注:由于“.bash_profile”经常被设置成先读到“.bashrc”的内容,所以如果图省事的话,右以把所有配置都放进“.bashrc”中以上的文件是每一位用户都有的设置。系统级的设置存储在文件“/etc/profile"文件“/etc/bashrc"及目录“/etc/profile.d"中用户就优先把自己的个性化设置存放在用户根目录配置文件中,当系统级与用户级的设置发生冲突时,将优先采用用户级的设置。三、bash的提示符命令echo $PS1可以显示当前的设定[akaedu@akaedu ~]$ echo $PS1[\u@\h \W]\$可以对shell进行设置来显示用户当前所在目录。{详见 man bash}方法:[akaedu@akaedu ~]$ cd /etc/profile.d[akaedu@akaedu profile.d]$ export PS1="\u@\h \w\\$"akaedu@akaedu /etc/profile.d$[akaedu@akaedu ~]$ gedit .bashrc即先采用环境变量测试,找到了合适的设置后加到.bashrc中四、环境变量在shell配置文件中一般定义了很多的环境变量。命令“set“可以列出所有当前定义的所有环境变量。环境变量可以分为三种:系统变量,环境变量和用户变量。shell 常用的系统变量表示方法        描述$n            $1表示第一个参数,$2表示第二个参数……$#            命令行参数的个数$0            当前程序的名称$?            前一个命令或函数的返回码$*            以“参数1,参数2,参数3……”形式保存所有参数$@            以“参数1”,“参数2”……形式保存所有参数$$            本程序的PID(进程ID号)$!            上一条命令的PID常用的shell环境变量名称            描述PATH          命令搜索路径,以冒号为分隔符。注意与DOS下不同的量,当前目录不在系统路径里。HOME          用户根目录的路径名。命令"cd"的默认参数COLUMNS       定义了命令编辑模式下可使用命令行的长度EDITOR        默认的行编辑器VISUAL        默认的可视编辑器HISTFILE      命令历史文件HISTSIZE      命令历史文件最多可包含的命令条数IFS           定义Shell使用的分隔符LOGNAME       用户登录名MAIL          指向一个需要shell监视其修改时间的文件。当该文件修改后,shell将提醒用户查收新邮件SUALMAILCHECK     shell检查邮件的周期,单位是秒SHELL         shell的路径名TERM          终端类型PS1           主命令提示符PS2           二级命令提示符,命令执行过程中要求输入数据时用PS3           select的命令提示符PS4           调试命令提示符MANPATH       寻找手册页的路径LD_LIBRARY_PATH    寻找动态链接库文件的路径,以冒号分隔所有的环境变量都在shell配置文件中定义,一般来说,变量名用大写在linux系统中,当设置一个变量时,直接用名称,而不需要加符号“$"。例如:PATH=/usr/bin:/bin:/usr/local/bin而要获变量值的话,就要在变量名前加符号“$"。例如:[akaedu@akaedu ~]echo $PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/akaedu/.mybin如果在变量名前没有符号"$",变量名会被当作普通文本。[akaedu@akaedu ~]echo PATHPATH注:处理“$PATH”时需要注意:该变量不能替换,而是要将新的字符添加到原来的值中。在大多数情况下,不能用"/PATH=/some/directory",因为这将删除"$PATH"中其他的所有目录。只能进行添加:PATH=$PATH:/some/directory也就是说,PATH的值被设成当前的值(以$PATH来表示)+新添加的目录[akaedu@akaedu ~]PATH=$PATH:/some/director[akaedu@akaedu ~]echo $PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/akaedu/.mybin:/some/directory新的变量仅是一个局部变量,仅在当前终端中有用。若要定义一个全局变量,就要将局部变量输出(export)export PATH=$PATH:/some/directory如果要将目录永久添加到环境变量“$PATH”中就必须把“export"那行命令添加到用户要目录下的“bash_profile"文件中。注意:不能放到.bashrc中,否则会导致PATH意外加长。五、Bash的功能1)自动补齐     Tab键的使用2)命令行的历史事件history命令的使用“!”的使用[akaedu@akaedu ~]!PPATH=$PATH:/some/directory[akaedu@akaedu ~]!65    //65是指的事件号cd /[akaedu@akaedu /]!!    //!!是指上一事件cd /也可以使用搜索模式 必须用?括起来[akaedu@akaedu ~]!?echo PATH?echo PATHPATH系统保存的历史事件数保存在HISTSIZE变量中。其默认值是1000,不过可以修改[akaedu@akaedu ~]echo $HISTSIZE1000[akaedu@akaedu ~]vi /etc/profileset history=128 [akaedu@akaedu ~]echo $HISTSIZE128历史事件被保存在一个文件中,文件名由变量HISTSIZE指定。通常其默认名是.bash_history"shell 还支持对历史命令的增量搜索。“Ctrl+r"(reverse-i-search)`P': echo PATH按回车就可运行,但按方向键左或右就可以进行编辑3)编辑命令行快捷键Ctrl+k    删除从光标到行尾的部分Ctrl+u    删除从光标到行首的部分Ctrl+w    删除从光标到当前单词开头的部分Ctrl+a    将光标移到行首Ctrl+e    将光标移动到行尾Ctrl+y    插入最近删除的单词Alt+d     删除从光标到当前单词结尾的部分Alt+a     将光标移动到当前单词的开头Alt+e     将光标移动到当前单词的结尾Alt+.      使用上一条命令的参数!$        重复前一个命令最后的参数<注:也可以使用功能键及方向键>4)命令的组合注:为了看起来更清楚,命令之间在符号之间增加了空格。而在实际中并不需要这么做。如 ls -a;du -hs 与ls -a;du -hs等价;组合方式一:command1;command2特点:先执行命令1,不管命令1是否出错,命令2都要执行组合方式二:command1 && command2特点:只有在命令1正确运行后才能执行命令2组合方式三:command1 || command2特点:如果第一个命令执行失败了,就执行每二个命令组合方式四:(command1 ;command2:……)在当前shell中执行{command1 ;command2:……}在子shell中执行5)任务调度(jobbing)与后台化(backgrounding)方法一:在命令的后面加一个&命令jobs可以列出当前终端中运行着的命令与程序[akaedu@akaedu ~]gedit &[1] 5376[akaedu@akaedu ~]jobs[1]+  Done                    gedit方法二:先使用快捷键 ctrl+z 挂起终端中正在运行的程序,然后使用 bg 命令将其放到后台去执行。如:[akaedu@akaedu ~]less /etc/bashrc[1]+  Stopped                 less /etc/bashrc[akaedu@akaedu ~]bg[1]+ less /etc/bashrc &[1]+  Stopped                 less /etc/bashrc注:一些应用程序,很可能还在测试期(beta),尽管在后台运行,也会在终端中输出一些信息。可以使用如下的命令,来使它到输出信息以/dev/null文件(叫碎纸机(shredder)) command &>/dev/null &6)命令的替换语法:command1 $(command2)或command1 'command2'7)文件名匹配通配符(wildcard)*            匹配文件名中任何字符串,包括空格串?           匹配文件名中的任何单个字符[...]       匹配“[]”中所包括的任何字符[!...]      匹配“[]”中非感叹号“!”之后的字符如[!0-9]表示非数字开头的字符串8)输入与输出重定向在shell中执行命令的时候,每个进程都和3个打开的文件相联系,并使用文件描述符来引用这些文件。系统中实际上有12个文件描述符,0,1,2分别是标准输入、标准输出和标准错误输出。*stdin: 标准输入,使用文件描述符 0*stdout:标准输出,使用文件描述符 1*stderr:标准错误输出,使用文件描述符2几个命令的介绍a)echo作用:来显示文本或变量,也可以把字符串输入到文件。形式:echo string如:[akaedu@akaedu ~]echo "hellO"hellO[akaedu@akaedu ~]echo $HOME/home/akaedu选项-n可以禁止输出后换行[akaedu@akaedu ~]echo -n "hellO"hellO[akaedu@akaedu ~]如果想把一个字符串输出到一个文件中,就可以使用重定向符号“>”[akaedu@akaedu ~]echo "hello hello">test[akaedu@akaedu ~]cat testhello hello[akaedu@akaedu ~]echo "shit what are you doing">test[akaedu@akaedu ~]cat testshit what are you doing[akaedu@akaedu ~]echo "hello hello">>test[akaedu@akaedu ~]cat testshit what are you doinghello hello由上可知:使用>会覆盖原来的内容,而使用 >> 则只是追加,这样可以根据需要进行灵活选择b)read可以从键盘或文件的某一行文本中读入信息,并将其赋给一个变量。如果只指定了一个变量,那么命令read将会把所有的输入赋给该变量,直到遇到第一个文件结束符或回车。其一般形式为:read variblel varible2[akaedu@akaedu ~]read stringthis is a test of read[akaedu@akaedu ~]echo $stringthis is a test of read[akaedu@akaedu ~]read name name2chenhao pengyong[akaedu@akaedu ~]echo $namechenhao[akaedu@akaedu ~]echo $name2pengyong[akaedu@akaedu ~]read name name2akaedu xiaoming xiaohua[akaedu@akaedu ~]echo $nameakaedu[akaedu@akaedu ~]echo $name2xiaoming xiaohua这表明录输入文过长时,shell将把超长部分全部赋给最后一个变c)catcat命令可以用来显示文件内容、创建文件,还可以用它来显示控制字符。一般形式:cat [option要]filename1 filename2 ……用途:一个简单的文字编辑器.如:[akaedu@akaedu ~]vi file1[akaedu@akaedu ~]vi file2[akaedu@akaedu ~]vi file3[akaedu@akaedu ~]cat file1helloone[akaedu@akaedu ~]cat file2l love it![akaedu@akaedu ~]cat file3fedora a great system![akaedu@akaedu ~]cat file1 file2 file3 >bigfile[akaedu@akaedu ~]cat bigfilehelloonel love it!fedora a great system![akaedu@akaedu ~]cat >file4hello hello what are you doing?why?are you ok?[akaedu@akaedu ~]cat file4hello hello what are you doing?why?are you ok?如上所示,如果想建一个文件并且输入一些内容,就可以使用cat命令,用cat把输出定向到该文件,就可以了。这时输入是键盘,输出是文件,当想结束输入时按下ctrl+d组合键即可。常用文件重定向命令命令                                   意义command >filename                     把标准输出重定向到一个新文件中command >>filename                    把标准输出重定向到一个文件中(追加方式)command > filename 2>&1               把标准输出和标准错误一起重定向到一个文件中command 2> filename                   把标准错误重定向到一个文件中command 2>> filename                  把标准错误以追加方式重定向到一个文件中command >> filename 2>&1                把标准错误和标准输出一起重定向到一个文件中(追加方式)command filename2           把command以文件filename作为标准输入,以文件filename2作为标准输出command command command command >&m                           把标准输出重定向到文件描述符m中command 例子:把文件/etc/passwd的用户ID域按照用户名排列。该命令的输出重定向到文件 sort.out中[akaedu@akaedu ~]cat /etc/passwd | awk -F: '{print $1}' | sort 1>sort.out[akaedu@akaedu ~]cat sort.outakaeduavahiavahi-autoipdbackupbincouchdbdaemongamesgdmgnatshplipirckernoopslibuuidlistlpmailmanmessagebusnewsnobodyoprofileproxypulserootrtkitsanedspeech-dispatchersshdsyncsyssyslogusbmuxuucpwww-data[akaedu@akaedu ~]cat /etc/passwd | awk -F: '{print $1}' | sort >sort.out也可以达到相同的效果注意:管道的使用管道也是一种输出重定向方式管道可以把一个命令的输出传递给另一个命令作为输入。管道用符号"|"表示。它的使用方法是:command1 | command2例如,可以对一个文件进行排序,然后管道输送到打印机[akaedu@akaedu ~]sort file3 | lp还可以在多个命令间进行重定向如:[akaedu@akaedu ~]$ cat /etc/passwd | awk -F: '{print $1}' | sort >sort.out9)shell中的快捷方式(别名)别名(alias)例如:~就代表了用户的根目录别名定义的语法是:alias shortcut='command'删除一个别名使用unalias不带参数将列出当前系统定义的所有别名[akaedu@akaedu ~]aliasalias ai='sudo apt-get install'alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'alias cman='man -M /usr/share/man/zh_CN'alias egrep='egrep --color=auto'alias fbterm='LANG=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8 fbterm'alias fgrep='fgrep --color=auto'alias grep='grep --color=auto'alias l='ls -CF'alias la='ls -A'alias ll='ls -alF'alias ls='ls --color=auto'注:如果命令中有空格,就需要使用引号。同时单引号与双引号是有区别的同时,别名不能重复,但一个命令可以有多个别名。补充说明:几种引号的说明单引号由单引号括起来的字符都作为普通字符出现。如:[akaedu@akaedu ~]$ string='$PATH'[akaedu@akaedu ~]$ echo $string$PATH双引号由双引号括起来的字符,除符号$,\,',"仍是特殊字符外,其余的字符都作为普通字符来对待。$用指定变量的值来代替这个变量和符号$\ 转义字符[akaedu@akaedu ~]string="$PATH"[akaedu@akaedu ~]echo $string/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/akaedu/.mybin反引号`它被shell解释为命令行[akaedu@akaedu ~]pwd/home/akaedu[akaedu@akaedu ~]string="current directory is `pwd`"[akaedu@akaedu ~]echo $stringcurrent directory is /home/akaedu再如[akaedu@akaedu ~]today=`date`[akaedu@akaedu ~]echo Today is $todayToday is 2008年 07月 08日 星期二 19:11:27 CST10)控制bash的工作方式bash中有一些特殊的变量,能控制bash以不同的方式工作。如 变量“noclobber"能防止在重定向输出时意外地覆盖一个文件。通过命令 set 可以设置变量 noclobber的值。命令 set 有两个参数:一个是指定变量开(on)或关(off),另一个就是特殊变量的变量名。要使某一特殊变量有效,用“-o”选项;要使其关,就用+O选项如[akaedu@akaedu ~]set -o noclobber[akaedu@akaedu ~]set +o noclobber此外,还有两个特殊变量也较用ignoreeof 用来禁止ctrl+d 来退出shellnoglob 让shell不扩展文件名中一些特殊的字符或字符串。例如,字符“*"等不再为通配符。
12-17 01:26