8.1 shell介绍
什么是Shell?
引用百度百科解释:Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。
实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。
总结:
1)Shell是一个命令解释器,提供用户与机器之间的交互。
2)支持特定语法,比如逻辑判断、循环。
3)每个用户都可以有自己特定的Shell。
4)CentOS7中的默认Shell为bash(Bourne Again Shell)。
5)其它的还有zsh、ksh等。
各种shell,在系统中用法大同小异。在Centos7中和zsh、ksh有关的包有如下所示。
8.2 命令历史
我们在shell交互界面使用过的命令是会被系统记录保存的。保存位置为,用户家目录下 .bash_history 文件里。
.bash_history 默认会保存1000条命令,数量是有HISTSIZE环境变量控制
命令历史刚开始会保存在内存中,所以我们有时会看到超过1000的命令历史,但是.bash_history里面仍然只有1000条命令历史。
history命令--用于显示指定数目的指令命令,读取历史命令文件中的目录到历史命令缓冲区和将历史命令缓冲区中的目录写入命令文件。
选项:
- -c:清空当前历史命令;
- -a:将历史命令缓冲区中命令写入历史命令文件中;
- -r:将历史命令文件中的命令读入当前历史命令缓冲区;
- -w:将当前历史命令缓冲区命令写入历史命令文件中。
环境变量HISTSIZE存放在/etc/profile文件里。
[root@liang-00 ~]# vim /etc/profile
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"
fi
# Path manipulation
if [ "$EUID" = "0" ]; then
pathmunge /usr/sbin
pathmunge /usr/local/sbin
else
pathmunge /usr/local/sbin after
pathmunge /usr/sbin after
fi
HOSTNAME=`/usr/bin/hostname 2>/dev/null`
HISTSIZE=1000
if [ "$HISTCONTROL" = "ignorespace" ] ; then
export HISTCONTROL=ignoreboth
else
export HISTCONTROL=ignoredups
fi
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
# By default, we want umask to get set. This sets it for login shell
# Current threshold for system reserved uid/gids is 200
# You could check uidgid reservation validity in
# /usr/share/doc/setup-*/uidgid file
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002
else
更改命令历史保存命令的数量,把HISTSIZE值修改一下,比如:HISTSIZE=5000,退出保存。
改完之后还需要source /etc/profile一下文件才能生效。
source命令
source命令也称为“点命令”,也就是一个点符号“.”,是bash的内部命令。功能:使Shell读入指定的Shell程序文件并依次执行文件中的所有语句source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。
我们在查看历史命令时默认并没有显示它执行的时间,若想显示命令执行的时间,把“HISTTIMEFORMAT”赋值就可以了,具体步骤为:
HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "
注意:上面环境变量的修改只在当前登录终端中生效。
要想在所有终端生效,依然是修改/etc/profile文件。
我们把HISTSIZE设置成1000,他只能在 ~/.bash_history 中保存1000条命令,这时我们可以给它加一个“a”权限,这样既可以防止别人删除还可以继续增加命令。
chattr +a ~/.bash_history
命令历史相关的操作:
- !! 执行最后一条历史命令;
- !n 执行历史命令的第n条;
- !word 执行以word开头的最近执行过的一条命令。
8.3 命令补全和别名
CentOS6、CentOS7都支持命令补全。如果敲出的命令前缀是唯一的,敲一下Tab键就可以补全命令(比如:你想用chattr命令,只需要敲出chat后敲一下Tab键就可以了),如果不是唯一的敲两下Tab键就会显示所有以此字符开头命令。
在CentOS7中还支持参数补全。
1)首先安装:yum install -y bash-completion
2)重启系统init 0
alias命令 对一条命令自定义别名,unalias可以取消别名。
alias命令的配置文件,一部分在用户家目录~/.bashrc文件中,一部分在/etc/profile.d/目录中。
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
8.4 通配符
通配符“*”,匹配一个或者多个字符;
通配符“?”,匹配单个任意字符;
[0-3],通配前缀为0-3的字符;
[0-9a-zA-Z],通配所有字母数字;
{1,2,3,a},通配1,2,3,a。
其它常用通配符。
[!abc]或[^abc],表示不匹配任意一个字符
[string1,string2],匹配字符串。
8.5 输入输出重定向
输出重定向“>”;
追加“>>”。
“2>” 错误信息输出;
“2>>” 错误信息追加输出。
无论错误还是正确信息都写入到后面文件内可以用“&>”来写入。或者分别用“>” 和“2>”写入指定的不同的文件。
输入重定向 “<”。此命令智能作用于命令,对文件不能使用。
8.6 管道符和作业控制
1)管道符,linux中管道符:“|”,把前面的正确输出,作为后面命令的操作对象。
命令格式:命令A|命令B,即命令A的正确输出作为命令B的操作对象。
2)作业控制;
- ctrl+z:暂时中止当前任务,放入后台;
- jobs:用于显示Linux中的任务列表及任务状态,包括后台运行的任务;
- fg:用于将后台作业(在后台运行的或者在后台挂起的作业)放到前台终端运行,后跟任务号,没有的话默认最后一个任务;
- bg:用于将作业放到后台运行,使前台可以执行其他任务,后跟任务号,没有的话默认最后一个任务。
这些作业控制只在当前终端中生效,其它终端无效。
ctrl+z,fg,jobs操作演示:
bg操作演示
sleep 1000 & 直接把sleep 1000放入后台去执行。
8.7-8-8 shell变量
shell变量
变量即在程序运行过程中它的值是允许改变的量。变量是用一串固定的字符来标示不固定的值的一种方法。变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储 Script 运行时可更改的程序信息,在 shell 中变量是不能永久保存在系统中的,必须在文件中声明。
用env和set可以查看变量,系统的变量一般都是大写的。。
{
local quoted;
_quote_readline_by_ref "$1" ret;
printf %s "$ret"
}
[root@liang-00 ~]# env |less
[root@liang-00 ~]# set |less
[root@liang-00 ~]#
变量命名规则:数字、字母、下划线,其中不能以数字作为开头。
变量值有特殊符号时,用单引号括起来。
全局变量
所谓全局变量是指同一个终端下登录后的子shell、子子shell中的变量。
命令 echo $SSH_TTY显示当前终端号
bash命令:在当前shell下执行此命令,会进入当前shell的子shell下。
用export命令来使变量在其子shell中生效。export liang=linxu。
但是在子shell中export liang=linxu其上一级shell中是不生效的。
取消变量的值:unset命令
unset 变量
8.9 环境变量配置文件
/etc/profile 文件:用户环境变量、交互、登录时才执行;
/etc/bashrc 文件:用户不用登录执行shell就生效;
~/.bashrc
~/.bash_profile
~/.bash_histroy
~/.bash_logout
关于这几个文件的讲解阿铭老师在论坛里讲的比较详细:http://ask.apelearn.com/question/7719
这里引用下:
【.bashprofile 与 .bashrc 的区别】 .bashprofile is executed for login shells, while .bashrc is executed for interactive non-login shells.
【login shell 与 non-login shell 的区别】
1、当你直接在机器login界面登陆、使用ssh登陆或者su切换用户登陆时,.bashprofile 会被调用来初始化shell环境 Note:.bashprofile文件默认调用.bashrc文件
.bashprofile中有如下内容_
if [ -f ~/.bashrc ]; then
_ . ~/.bashrc_
fi
2、当你不登陆系统而使用ssh直接在远端执行命令,.bashrc 会被调用
3、当你已经登陆系统后,每打开一个新的Terminal时,.bashrc 都会被再次调用。
测试准备工作
hclient2主机hadoop用户家目录下执行
[hadoop@hclient2 ~]$ echo "invoke hclient2:~/.bashrc">>.bashrc
[hadoop@hclient2 ~]$ echo "invoke hclient2:~/.bash_profile">>.bash_profile
Login Shell
1、窗口登陆
Red Hat Enterprise Linux Server release 6.3 (Santiago)
Kernel 2.6.32-279.el6.x86_64 on an x86_64
hclient2 login: hadoop
Password:
Last login: Mon Feb 25 23:03:45 on tty1
invoke hclient2:~/.bashrc
invoke hclient2:~/.bash_profile
[hadoop@hclient2 ~]$
2、SSH 登陆
[hadoop@hserver ~]$ ssh hclient2
Last login: Mon Feb 25 22:42:19 2013 from hserver
invoke hclient2:~/.bashrc
invoke hclient2:~/.bashprofile [hadoop@hclient2 ~]$ 3、su 登陆 [root@hclient2 ~]# su - hadoop invoke hclient2:~/.bashrc invoke hclient2:~/.bashprofile
Non-login Shell:
Note: ssh …[user@] hostname [command]
If command is specified, it is executed on the remote host instead of a login shell.
[hadoop@hserver ~]$ ssh hclient2 hostname
invoke hclient2:~/.bashrc
hclient2
【故】若要配置环境变量之类,最保险是写在 .bashrc 文件中。因为不管是登陆还是不登陆,该文件总会被调用!
------------------------------------------------------------------------------------------------------------------------------------------
PS1环境变量:设置命令提示符显示的内容
用echo $PS1命令查看其格式
比如我们可以把[root@liang-00 ~]改为** **把W改为w。
PS1变量中提示符各项含义:
- \d :代表日期,格式为weekday month date,例如:Wed Dec 12
- \H :完整的主机名称。例如:hostname是debian.linux
- \h :仅取主机的第一个名字,如上例,则为debian,.linux则被省略
- \t :显示时间为24小时格式,如:HH:MM:SS
- \T :显示时间为12小时格式
- \A :显示时间为24小时格式:HH:MM
- \u :当前用户的账号名称 如:root
- \v :BASH的版本信息 如:3.2
- \w :完整的工作目录名称。家目录会以 ~代替 如显示/etc/default/
- \W :利用basename取得工作目录名称,所以只会列出最后一个目录 如上例则只显示default
- \# :下达的第几个命令
- \$ :提示字符,如果是root时,提示符为:# ,普通用户则为:$
PS2环境变量:设置bash的第二级提示符
编写本博客所用到的参考文献:
https://www.cnblogs.com/huamei2008/p/7895138.html
http://man.linuxde.net
http://www.runoob.com/
http://ask.apelearn.com/question/7719