1. shell介绍
创建一个普通用户,默认的shell为/bin/bash/.
- shell的含义:
首先shell的英文含义是“壳”;它是相对于内核来说的,因为它是建立在内核的基础上,面向于用户的一种表现形式,比如我们看到一个球,见到的是它的壳,而非核。Linux中的shell,是指一个面向用户的命令接口,表现形式就是一个可以由用户录入的界面,这个界面也可以反馈运行信息;
- shell在Linux中的存在形式
由于Linux不同于Windows,Linux是内核与界面分离的,它可以脱离图形界面而单独运行,同样也可以在内核的基础上运行图形化的桌面。这样,在Linux系统中,就出现了两种shell表现形式,一种是在无图形界面下的终端运行环境下的shell,另一种是桌面上运行的类似Windows 的MS-DOS运行窗口,前者我们一般习惯性地简称为终端,后者一般直接称为shell
- shell如何执行用户的指令
shell有两种执行指令的方式,第一种方法是用户事先编写一个sh脚本文件,内含shell脚本,而后使用shell程序执行该脚本,这种方式,我们习惯称为shell编程。
第二种形式,则是用户直接在shell界面上执行shell命令,由于shell界面的关系,大家都习惯一行行的书写,很少写出成套的程序来一起执行,所以也称命令行。
2. 命令历史
- 命令# history可以查看,已写入的命令历史;同时我们也可以用向上的方向键查看命令历史。
这些命令历史存放在用户家目录下/.bash_history,最大可存1000条命令,并由系统内部配置的环境变量HISTSIZE配置,用echo $HISTSIZE查看可以看到数字为1000。有时我们可以发现变量超过1000,是因为命令暂时存在内存中,并未写入/.bash_history中,只有在退出终端时,命令才会被保存到/.bash_history中
- # history -c,可以清楚内存中的命令历史,但不能清楚/.bash_history配置文件中的命令历史
- 我们也可以改变上文所提到的环境变量HISTSIZE。
首先编辑配置文件# vi /etc/profile,用/ HISTSIZE,找到相关行,然后把1000数字改为自己想要的数字,例如5000。改好后,需要重新进入终端或使用命令# source /etc/profile来使设置的变量生效,如下图所示
- 跟命令历史相关的还有一个环境变量为HISTTIMEFORMAT,设置这个环境变量可以显示出命令的时间
具体操作如下图所示
若想永久保存HISTTIMEFORMAT设置,可以编辑/etc/profile配置文件,如下图所示,之后再# source /etc/profile即可
- 如果想要永久保存/.bash_history下的命令历史,我们可以用命令# chatter +a /.bash_history,给文件加隐藏权限a权限,那么即使HISTSIZE变量设置为1000,命令历史也只能追加不能删除了。
注:如果没有正常退出终端,那么命令历史便不能完整保存
- # !!,可以显示history中最后一条命令
- # in(数字),可以执行history中指定条数的命令,例如如下图所示,想要执行命令历史中第761条命令,我们就可以写# !761,就是执行了761条# du -sh amingliux.tar.xz.
- # !word, 可以运行命令历史中以指定word开头的最新的那条命令
3.命令补全和别名
介绍和命令相关的特性
- 按tab键,可以补全命令或者文件路径
当遇到开头一样,只有一个命令或文件时,则按一次tab键即可
如果开头一样的命令或文件有多个时,则需要按两次tab键
注:与centOS6不同7可以支持补全参数,默认是不支持的需要安装# yum install -y bash-completion,然后重启终端
- 别名alias,会用于给较长且复杂的命令设置别名,来提高效率
语法# alias 原名='别名'
别名保存在用户家目录下/.bashrc或者配置文件/etc/profile.d/中,且自定义的别名存在/.bashrc下
如果想要撤销别名使用# unalias 别名,即可
4. 通配符
- 通配符
如下图所示,ls *.txt可以列出当前目录下所有,以.txt结尾的文件,而ls ?.txt, 只能列出txt前字符为一个的文件
*可以放到任意位置
因为?只匹配一个字符,所以如上图ls ?.txt则不会列出bb.txt文件
- 【】
5.输入输出重定向
0 表示stdin标准输入;
1 表示stdout标准输出;
2 表示stderr标准错误。
- 输出重定向 --- >表示覆盖原文件内容,>>表示追加内容。两个命令都是如果文件不存在则创建文件
例如
# cat 1.txt > 2.txt, 此命令会使1.txt的内容重写到2.txt中,且2.txt中原有的内容不保存
# cat 1.txt >> 2.txt,与> 不同,此命令会吧1.txt的内容追加至2.txt中,且2.txt中原有的文件内容仍在
- 2> & 2>>错误重定向&追加重定向, 可以把错误命令的信息重写或追加到指定的文件中去,如下图所示,不存在命令lsaaa, 显示错误信息,用2> 和2>>就可以把错误信息重写或追加到a.txt.
# lsaaa 2> a.txt; # lsaaa 2>> a.txt
- &> ; &>>, 可以把正确的输出和错误的输出同时定向到指定文件
如下图所示,ls [12].txt 为正确的输入,而aaa.txt不存在则ls aaa.txt便为错误,我们可以ls [12].txt aaa.txt &> a.txt; ls [12].txt aaa.txt &>> a.txt, 在cat a.txt可以发现正确的输出和错误的输出都被写入到了a.txt中
- 上条介绍了如何把正确和错误的输出定向到同一个文件中,我们也可以把正确和错误分开分别定向到各自的文件中去
仍然使用上面的例子,ls [12].txt aaa.txt > 1.txt 2> a.txt, 用cat分别查看1.txt和a.txt,可以发现正确和错误的输出被分别写入到了1.txt和a.txt
如下图所示
- 命令 >> 文件 2>&1 :以追加的方式,把正确输出和错误输出都保存在文件中。
- 输入重定向 —— <
可以把<右面的文件作为<左面命令的输入,例如# wc -l < 1.txt, 就是1.txt文件内容作为命令# wc -l的输入,如下图所示
注:不可以如下图所示那样使用
6.管道符和作业控制
1)管道符
把前面输出的内容传给后面的命令。
例如下图所示,# find ./ -type f |wc -l,则表示把查询出的当前目录下所有的文件作为管道符后面命令#wc -l的输入,从而得出结果统计出当前目录下的文件数量为30.
2)作业控制
- ctrl z可以用来暂停一个任务
例如在我们用# vim编辑一个文件中,想要临时暂停任务,就可以使用Ctrl z
如果想要恢复暂停的任务可以使用# fg
- # jobs命令可以列出已经暂停或后台运行的任务
如下图所示
如果有多个已暂停的任务,想要恢复指定的任务,可以使用# fg 任务的id号。使用上图的例子,如果我们想要恢复对aa.txt文件的编辑,便可以 # fg 2
- # bg命令可以使已暂停的任务在后台继续运行
例如,我们运行命令#vmstat 1(可以实时显示系统的状态),在用Ctrl z暂停任务后,便可以用# bg命令在后台恢复运行,虽然在屏幕中仍可显示出vmstat 1 的运行结果,但是不影响操作新的命令,且用#jobs查看任务,可以发现vmstat 1已经恢复运行了
注:如果在有多个已暂停或在后台运行的任务时,#fg、#bg后面不加任务ID就会对最后一个任务进行操作
- # sleep 数字,表示暂停多少秒
- 在命令后面加shift 7 (&), 可以直接使命令在后台运行
7. 变量
PATH, HOME, PWD, LOGNAME
- # env,可以查看到系统中的变量,系统中的变量通常都是英文大写
- # set, 此命令也可以用来查看变量,与# env不同的是,#set还可以查看用户自定义的变量
- 自定义变量
- 变量的叠加
注:单引号和双引号
首先说下他们的共同点: 好像就只有
一个,就是它们都可以用来界定一个字符串,这个没什么好解释的,真正需要记住的是它们区别,
所以经过整理后,它们的区别主要包括:
1)、单引号属于强引用,它会忽略所有被引起来的字符的特殊处理,被引用起来的字符会被原
封不动的使用,唯一需要注意的点是不允许引用自身;
2)、双引号属于弱引用,它会对一些被引起来的字符进行特殊处理,主要包括以下情况:
1:$加变量名可以取变量的值 ,比如:
[root@localhost ~]# echo '$PWD'
$PWD
[root@localhost ~]# echo "$PWD"
/root
2:反引号和$()引起来的字符会被当做命令执行后替换原来的字符,比如:
[root@localhost ~]# echo '$(echo hello world)'
$(echo hello world)
[root@localhost ~]# echo "$(echo hello world)"
hello world
[root@localhost ~]# echo '`echo hello world`'
`echo hello world`
[root@localhost ~]# echo "`echo hello world`"
hello world
3:当需要使用字符($ ` " \)时必须进行转义,也就是在前面加\ ;
[root@localhost ~]# echo '$ ` " \'
$ ` " \
[root@localhost ~]# echo "\$ \` \" \\"
$ ` " \
- 全局变量
# w, 可以用来查看,用户终端的登陆情况
# echo $SSH_TTY, 可以用来查看当前终端下用来登陆的TTY
一般来说我们在一个shell中定义一个变量的话,只在当前shell中生效,并不在其子shell中生效,如果想要在子shell中也生效,使用# export,例如# export r=1111
注:此全局变量是指作用于向下的shell,不能作用于上层的shell
如果想要打开一个子shell,可直接运行# bash命令,同时用pstree可以查看当前所在的shell
- #unset 变量的名字,便可取消变量的赋值
8.环境变量配置文件
http://blog.51cto.com/13503302/2084137
Linux中环境变量包括系统级和用户级,系统级的环境变量是每个登录到系统的用户都要读取的系统变量,而用户级的环境变量则是该用户使用系统时加载的环境变量。
所以管理环境变量的文件也分为系统级和用户级的,下面贴一个网上找到的讲的比较明白的文件介绍(略作修改)[1]:
系统级:
/etc/profile:该文件是用户登录时,操作系统定制用户环境时使用的第一个文件,应用于登录到系统的每一个用户。该文件一般是调用/etc/bash.bashrc文件。
/etc/bash.bashrc:系统级的bashrc文件。
/etc/environment:在登录时操作系统使用的第二个文件,系统在读取你自己的profile前,设置环境文件的环境变量。
用户级(这些文件处于家目录下):
~/.profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。这里是推荐放置个人设置的地方
~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。不推荐放到这儿,因为每开一个shell,这个文件会读取一次,效率肯定有影响。
~/.bash_profile or ~./bash_login:这里没有引用作者的,下面会提到
~/.pam_environment:用户级的环境变量设置文件,没有做测试,不知道管不管用。