全部博文(298)
分类: Python/Ruby
2012-03-05 22:45:33
让你系统的了解shell
转:http://blog.chinaunix.net/space.php?uid=26495963&do=blog&id=3087341
当你在进行登录时,系统会检查的文档:
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_profile
bash的初步:
一、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 PATH
PATH
注:处理“$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 ~]!P
PATH=$PATH:/some/directory
[akaedu@akaedu ~]!65 //65是指的事件号
cd /
[akaedu@akaedu /]!! //!!是指上一事件
cd /
也可以使用搜索模式 必须用?括起来
[akaedu@akaedu ~]!?echo PATH?
echo PATH
PATH
系统保存的历史事件数保存在HISTSIZE变量中。其默认值是1000,不过可以修改
[akaedu@akaedu ~]echo $HISTSIZE
1000
[akaedu@akaedu ~]vi /etc/profile
set history=128
[akaedu@akaedu ~]echo $HISTSIZE
128
历史事件被保存在一个文件中,文件名由变量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 test
hello hello
[akaedu@akaedu ~]echo "shit what are you doing">test
[akaedu@akaedu ~]cat test
shit what are you doing
[akaedu@akaedu ~]echo "hello hello">>test
[akaedu@akaedu ~]cat test
shit what are you doing
hello hello
由上可知:使用>会覆盖原来的内容,而使用 >> 则只是追加,这样可以根据需要进行灵活选择
b)read
可以从键盘或文件的某一行文本中读入信息,并将其赋给一个变量。如果只指定了一个变量,那么命令read将会把所有的输入赋给该变量,直到遇到第一个文件结束符或回车。
其一般形式为:read variblel varible2
[akaedu@akaedu ~]read string
this is a test of read
[akaedu@akaedu ~]echo $string
this is a test of read
[akaedu@akaedu ~]read name name2
chenhao pengyong
[akaedu@akaedu ~]echo $name
chenhao
[akaedu@akaedu ~]echo $name2
pengyong
[akaedu@akaedu ~]read name name2
akaedu xiaoming xiaohua
[akaedu@akaedu ~]echo $name
akaedu
[akaedu@akaedu ~]echo $name2
xiaoming xiaohua
这表明录输入文过长时,shell将把超长部分全部赋给最后一个变
c)cat
cat命令可以用来显示文件内容、创建文件,还可以用它来显示控制字符。
一般形式:cat [option要]filename1 filename2 ……
用途:一个简单的文字编辑器.
如:
[akaedu@akaedu ~]vi file1
[akaedu@akaedu ~]vi file2
[akaedu@akaedu ~]vi file3
[akaedu@akaedu ~]cat file1
hello
one
[akaedu@akaedu ~]cat file2
l love it!
[akaedu@akaedu ~]cat file3
fedora a great system!
[akaedu@akaedu ~]cat file1 file2 file3 >bigfile
[akaedu@akaedu ~]cat bigfile
hello
one
l love it!
fedora a great system!
[akaedu@akaedu ~]cat >file4
hello hello what are you doing?
why?
are you ok?
[akaedu@akaedu ~]cat file4
hello 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 < filename >filename2 把command以文件filename作为标准输入,以文件filename2作为标准输出
command
command << deliniter 从标准输入中读入,直到遇到分界符delimiter分界符
command <&m 把文件描述符m作为标准输入
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.out
akaedu
avahi
avahi-autoipd
backup
bin
couchdb
daemon
games
gdm
gnats
hplip
irc
kernoops
libuuid
list
lp
mail
man
messagebus
news
nobody
oprofile
proxy
pulse
root
rtkit
saned
speech-dispatcher
sshd
sync
sys
syslog
usbmux
uucp
www-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.out
9)shell中的快捷方式(别名)
别名(alias)
例如:~就代表了用户的根目录
别名定义的语法是:
alias shortcut='command'
删除一个别名使用unalias
不带参数将列出当前系统定义的所有别名
[akaedu@akaedu ~]alias
alias 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 $string
current directory is /home/akaedu
再如
[akaedu@akaedu ~]today=`date`
[akaedu@akaedu ~]echo Today is $today
Today is 2008年 07月 08日 星期二 19:11:27 CST
10)控制bash的工作方式
bash中有一些特殊的变量,能控制bash以不同的方式工作。如 变量“noclobber"能防止在重定向输出时意外地覆盖一个文件。通过命令 set 可以设置变量 noclobber的值。命令 set 有两个参数:一个是指定变量开(on)或关(off),另一个就是特殊变量的变量名。
要使某一特殊变量有效,用“-o”选项;要使其关,就用+O选项
如
[akaedu@akaedu ~]set -o noclobber
[akaedu@akaedu ~]set +o noclobber
此外,还有两个特殊变量也较用
ignoreeof 用来禁止ctrl+d 来退出shell
noglob 让shell不扩展文件名中一些特殊的字符或字符串。例如,字符“*"等不再为通配符