文章目录
《鸟哥》
Shell and Shell scripts(BASH)
命令别名和历史命令
alias,unalias
举个栗子:一页一页查看很长的文档
原来是要输这样的命令才行ls -al | more
,现在只需要alias lm='ls -al | more'
;
再来个栗子:rm可能误删文档,可以设置成-i选项
询问你是否删除:
alias rm='rm -i'
想看一下自己设置了哪些别名,alias
一下就好啦:
对了,之前的vi
和vim
还是不一样的额,那就把它设置成一样的吧:alias vi='vim'
;
如果不想要了,那就取消掉unalias lm
history
history
太长了,利用前面的重命名操作简化一下吧:
列出所有history&& 最近3条
把当前历史记录写到histfile里面
his的几个实际作用–运行历史命令
BASH操作环境
运行一下/bin/ls
和ls
会发现不一样的地方:
因为 /bin/ls
是直接取用该命令来下达,而 ls
会因为『alias ls='ls --color=tty'
』这个命令别名而先使用。
通过type
命令也可以查到命令的运行顺序啦:
观察一下echo
的运行顺序:
可以看到,别名是优先级最高的,内建次之,最后才是$PATH
。
BASH的进站欢迎界面配置
/etc/issue
, /etc/motd
可以看到里面有\n \l
这种字符,肯定有猫腻,他们是啥意思,查表:
issue 内的各代码意义
\d 本地端时间的日期;
\l 显示第几个终端机接口;
\m 显示硬件的等级 (i386/i486/i586/i686...);
\n 显示主机的网络名称;
\o 显示 domain name;
\r 操作系统的版本 (相当于 uname -r)
\t 显示本地端时间的时间;
\s 操作系统的名称;
\v 操作系统的版本。
做个栗提拔:通过配置得到以下的进站画面
Ubuntu release 16.04.6
Date: 2009-02-05 17:29:19
Kernel 2.6.18-128.el5 on an i686
Welcome!
heihei写个名字玩玩吧:
/etc/motd
这个玩意就是给telnet
远程得时候用的,登录的时候就不会显示上面那个了,会显示这个文件里的内容哦
编辑一下随便写写吧:
BASH的环境配置
我们常用到的环境变量就在环境配置文件中,bash启动的时候会读取,所以我们就能使用环境变量啦!
注意,前面我们自定义的别名啥的,重启就没有了哦,除非你把它配置在环境配置文件里
login和non-login SHELL
这俩有啥区别呢:login吧需要完整的登录过程,而non-login就是不需要登录了,在已经登录的基础上开个新的,没有登录过程,如上图,在已经登录的界面再启动终端去bash就是运行的子程序了,所在环境也就是non-login shell
的环境
/etc/profile
每个登录都会读取的配置文件,配置整体的环境(不要轻易修改)
该配置的主要变量有:
- PATH
- USER
- HOSTNAME
- HISTSIZE
它还会呼叫外部的配置数据,比如: etc/inputrc
:热键、声音等等etc/profile.d/*.sh
:颜色、别名等etc/sysconfig/i18n
:语系的重要文件LANG等
bash 的 login shell 情况下所读取的整体环境配置文件其实只有 /etc/profile
源自鸟哥的图:
整个login shell的读取过程,
实线的的方向是主线流程,虚线的方向则是被呼叫的配置文件!从上面我们也可以清楚的知道,在 CentOS 的 login shell 环境下,最终被读取的配置文件是『 ~/.bashrc 』这个文件喔!所以,你当然可以将自己的偏好配置写入该文件即可。
source:读入环境配置文件
可以读取配置文件 但是不注销登录source + 文件名
bashrc(non-login shell 会读)
其他的相关配置:
/etc/man.config
:man的时候去哪里看路径配置~/.bash_history
:读历史命令~/.bash_logout
:登出的时候系统要做些什么
终端环境配置
stty列出环境中的按键列表:
这个上面的^
是Ctrl
的意思。有几个比较重要的:
eof : End of file 的意思,代表『结束输入』。
erase : 向后删除字符,
intr : 送出一个 interrupt (中断) 的讯号给目前正在 run 的程序;
kill : 删除在目前命令列上的所有文字;
quit : 送出一个 quit 的讯号给目前正在 run 的程序;
start : 在某个程序停止后,重新启动他的 output
stop : 停止目前屏幕的输出;
susp : 送出一个 terminal stop 的讯号给正在 run 的程序
set配置命令输入输出环境
一些bash默认的组合键汇总
Ctrl + C 终止目前的命令
Ctrl + D 输入结束 (EOF),例如邮件结束的时候;
Ctrl + M 就是 Enter 啦!
Ctrl + S 暂停屏幕的输出
Ctrl + Q 恢复屏幕的输出
Ctrl + U 在提示字符下,将整列命令删除
Ctrl + Z 『暂停』目前的命令
利用通配符来玩一下:
bash环境中的特殊符号:
#
批注符号:这个最常被使用在 script 当中,视为说明!在后的数据均不运行
\
跳脱符号:将『特殊字符或通配符』还原成一般字符
|
管线 (pipe):分隔两个管线命令的界定(后两节介绍);
;
连续命令下达分隔符:连续性命令的界定 (注意!与管线命令并不相同)
~
用户的家目录
$
取用变量前导符:亦即是变量之前需要加的变量取代值
&
工作控制 (job control):将命令变成背景下工作
!
逻辑运算意义上的『非』 not 的意思!
/
目录符号:路径分隔的符号
>, >>
数据流重导向:输出导向,分别是『取代』与『累加』
<, <<
数据流重导向:输入导向 (这两个留待下节介绍)
''
单引号,不具有变量置换的功能
""
具有变量置换的功能!
两个『 ` 』中间为可以先运行的命令,亦可使用 $( )
( ) 在中间为子 shell 的起始与结束
{ } 在中间为命令区块的组合!
数据流重导向
根据我自己浅薄的理解,大概就是文件被读取以后,作为标准输入传到了命令,如果执行错误的话,就返回标准错误;若执行成功,就返回标准输出到文件(一般就是显示在屏幕上)
输入输出传送的字符是这样的:
标准输入 (stdin) :代码为 0 ,使用 < 或 << ;
标准输出 (stdout):代码为 1 ,使用 > 或 >> ;
标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ;
所以,
1>
:覆盖【正确数据】输出1>>
:添加【正确数据】输出2>
:覆盖【错误数据】输出2>>
添加【错误数据】输出
一般用户运行find / -name testing
:
这个意思是:在/home下寻找名字叫做bashrc的文件,找到了就输出到list_right,找不到就继续输出到了list_error,这个更改的输出了,所以就没有输出到list_error了。
/dev/null 黑洞装置
可以把错误丢到黑洞里去(PS:人生也能有黑洞该多好,做的错事都可以扔进去)
find /home -name .bashrc 2> /dev/null
要把命令数据都写到List里面的话,
find /home -name .bashrc > list 2> list <==错误,次序错乱
find /home -name .bashrc > list 2>&1 <==正确
find /home -name .bashrc &> list <==正确
标准输入:<与<<
这样的话,98bashrc
的内容原原本本的写入到了catfile
里面:
<< eof
命令行的判断依据:;, &, ||
- command ; command
举个栗子:在关机的时候我希望可以先运行两次 sync 同步化写入磁盘后才 shutdown 计算机
sync; sync; shutdown -h now
看个梨子。首先呢看/tmp/abc存在不,好像不存在哦 。那就创建一个abc的目录,然后查看里面的内容(现在肯定是空的)接着建立一个叫hehe的文件,完了以后呢,再看abc里面有没有东西,hei果然有个hehe了。
如果想直接如果不存在就建一个的话,就用||
符号:
梨子:不知道abc存不存在,但是要在abc下面新建hehe,存在的话就直接建,不存在就创建一个:
上面粒子的思路图大概如此:
做个提姆吧:
以 ls 测试 /tmp/vbirding 是否存在,若存在则显示 “exist” ,若不存在,则显示 “not exist”!
假设判断式的公式:
command1 && command2 || command3
管道命令
利用less
命令前后翻页查看比较方便:
管道意思很好理解,就像一根根的管子接起来,第一根流出去的就是第二根流进去的,以此类推,管道这个名字取得真是妙不可言!
提取命令:cut/grep
cut:
-d
后面接分隔字符,-f
后面接取出第几段
cut -c 12-
取每行第12个字符以后的:
原来的:
处理过后的:
要是想要12-20的字符当然也可以:cut -c 12-20
来个梨子:
近期用户登录的记录是这样的,
但是,我只想知道用户名就可以了,用空格来分割,