一、shell的内置命令
shell自身提供了一些命令,称为内置命令,我们已经接触过一些shell的内置命令。
比如:
linux@myccloves:~$ which ls
/bin/ls
linux@myccloves:~$ which history cd fc jobs set
linux@myccloves:~$
我们用which查看ls,发现它在/bin/目录里。但查看history, cd, fc, jobs, set等命令,没有查到这些命令所在的位置,因为这些命令在shell程序内部,称为内置命令。
可以用help查看所有的内置命令
linux@myccloves:~$ help
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
......
job_spec [&] history [-c] [-d offset] [n] or history >
(( expression )) if COMMANDS; then COMMANDS; [ elif COMMA>
......
二、别名
别名允许用户自定义命令名,允许用户把命令和常用的参数或选项组合在一起。
(一)定义别名:
alias 别名=值
比如经常查看进程,运行: ps aux,但总输入aux太麻烦,能不能只用ps就相当于ps aux的效果? 当然可以:
linux@myccloves:~$ alias ps='ps aux'
linux@myccloves:~$ ps
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 225292 9124 ? Ss 09:01 0:02 /sbin/init splash
root 2 0.0 0.0 0 0 ? S 09:01 0:00 [kthreadd]
......
再比如:能不能用另外一个名字替代一个命令的名字,当然可以:
linux@myccloves:~$ alias h=head
linux@myccloves:~$ h -2 /etc/os-release
PRETTY_NAME="Deepin 15"
NAME="Deepin"
既然这样,老陌有很多歌曲放在了一个很遥远的地方,由于deepin音乐播放器总自动停止,所以老陌经常用mplayer在终端播放音乐。但问题是每次进入这个遥远的地方太麻烦了……
linux@myccloves:~$ cd /media/linux/database/me/music
linux@myccloves:/media/linux/database/me/music$ mplayer dj-1.mp3
现在有了alias应该可以牛逼一把了吧。
linux@myccloves:~$ alias music='cd /media/linux/database/me/music'
linux@myccloves:~$ music
linux@myccloves:/media/linux/database/me/music$ mplayer dj-1.mp3
现在老陌想听歌,只要输入music,马上传送到音乐仓库了。 哇哈哈!!
(二)查看定义了哪些别名
直接输入alias就可以了。如:
linux@myccloves:/etc$ alias
alias ll='ls -l'
alias ls='ls --color=auto'
alias music='cd /media/linux/database/me/music'
(三)删除别名
删除别名用 unalias 命令:
linux@myccloves:~$ unalias music
linux@myccloves:~$ alias
alias ll='ls -l'
alias ls='ls --color=auto'
linux@myccloves:~$
观察,music别名被删除了。 一个小问题,如果别名和命令名冲突了,先执行谁?
linux@myccloves:~$ alias ls='cd /etc/samba/'
linux@myccloves:~$ ls
linux@myccloves:/etc/samba$
看到了吧,以事实说话,执行ls,得到的结果是进入了/etc/samba目录。如果ls 定义删除文件呢?死都不知道怎么死的...
三、自定义提示符
提示符就是等待用户输入命令部分。如:
linux@myccloves:~$
常见的提示符有两种:
- 基本提示符
- 第二提示符
我们发现,当输入没有完成时,按下回车之后shell继续等待用户输入,这时给出的提示符 > 就是第二提示符。
(一) 用PS1和PS2自定义提示符
这两个环境变量用于定义提示符。PS1对应基本提示符,PS2对应第二提示符。既然提示符是提示输入命令的作用,我们就改一下:
linux@myccloves:~$ PS1='请输入命令: '
请输入命令: PS2='继续输入: '
请输入命令: echo "hello
继续输入: world
继续输入: !
继续输入:
当我们用 PS1='请输入命令: ' 定义了提示符后,马上提示符就变成了”请输入命令: “。 之后设置第二提示符为:PS2='继续输入: ',我们再次尝试echo "hello输入练习,发现第二提示符也变了。
好吧,再让我们玩一次:
linux@myccloves:~$ PS1='love deepin: '
love deepin: ls /
bin etc initrd.img.old lib64 mnt recovery sbin tmp vmlinuz
boot home lastore lost+found opt root srv usr vmlinuz.old
dev initrd.img lib media proc run sys var
love deepin:
我们可以用一些转义序列定义提示符,下面列出了常用的转义序列:
序列 | 说明 |
---|---|
d | 显示日期 |
T | 显示时间 |
h | 显示主机名 |
u | 显示用户名 |
w | 显示路径 |
W | 显示路径的最后一个目录名 |
! | 显示历史记录号 |
$ | 如果是超级用户显示#, 如果是普通用户显示$ |
现在老陌定制一个和centos一样的提示符,因为老陌喜欢他的路径风格,不管路径多长,始终显示最后一个单词。提示符格式如下: [root@localhost ~]#
PS1='[u@h W]$ '
注意:提示符中有一个字符有着通用的规则:# 表示超级用户,$ 表示普通用户,我们应该记住它。
四、配置文件立刻生效
我们经常修改~/.bashrc文件,这个文件在用户登录时会自动调用,但我们修改完不想退出系统再重新登录,此时可以source一下,相当于执行一次,重新配置环境变量。
[linux@myccloves test]$ echo "alias ld='ls -ld'" >> ~/.bashrc
[linux@myccloves test]$ source ~/.bashrc
[linux@myccloves test]$ ld
drwxr-xr-x 2 linux linux 4096 Jul 21 07:50 .
我们修改了~/.bashrc文件,之后source一下,发现ld命令可以执行了。 与source功能一样的命令,就是在脚本前输入一个点,这个点相当于source。
[linux@myccloves test]$ . ~/.bashrc
这个方法很好,不用重新登录。当我们重新修改配置文件,想要立刻生效一定不要忘记source。
五、bash初始化
bash shell一般分为四类:登录shell,非登录shell,交互式shell, 非交互式shell。
当登录一台linux,您会看到提示符,这就是就登录shell。如:登录到虚拟终端,远程登录到一台主机等。登录shell又是交互式shell。
为了区别我们列举一些事例:
从虚拟控制台登录的, 通过网络登录到远程主机,x初始化的shell,这些都是登录shell,是交互式shell。手动运行bash启动的shell,不是登录shell,但他是交互式shell,在命令替换中的子shell,被圆括号分组的命令使用的子shell,执行脚本时使用的子shell不是登录shell,也不是交互式shell。
(一)登录shell:
以redhat系统为例:
当我们登录系统时,登录shell首先获取文件/etc/profile,这个文件初始化一些全局环境变量,之后获取/etc/profile.d/*.sh相匹配的文件。之后shell会去用户主目录里获取~/.bash_profile配置文件,之后获取 ~/.bashrc配置文件,最后获取/etc/bashrc配置文件。
注意:/etc/bashrc里面的内容和/etc/profile中的内容很像,但/etc/bashrc中定义的大部分是非登录shell用的环境变量。
(二)非登录,交互式shell
启动这个shell会自动获取~/.bashrc, 之后获取文件/etc/bashrc。
(三)非登录非交互式shell
不获取任何配置文件。
注意:只有登录shell才可以获取/etc/profile,~/.bash_profile,而~/.bashrc和/etc/bashrc文件能被所有shell(登录和非登录)获取。一般前两个用于配置环境变量,因为它们只初始化一次,后两个用于自定义变量,如:别名等。
(四)启动配置文件的介绍
文件 | shell类型 | 预期功能 |
---|---|---|
/etc/profile | 登录shell | 通用的有效环境变量 |
/etc/profile.d/*.sh | 登录shell | 软件包特有的环境变量 |
~/.bash_profile | 登录shell | 用户特有的环境变量 |
~/.bashrc | 所有交互式shell | 用户特有的别名,shell功能和shell选项 |
/etc/bashrc | 所有交互式shell | 通用别名,shell功能和shell选项 |
(五)退出登录shell
~/.bash_logout 用户注销时调用,这个一般很少用。有人用它清理~/.bash_history文件,但这不是好习惯,因为命令历史可以查看用过的命令,提高工作效率。而且系统出现故障可以从命令历史中查看,执行了什么命令导致故障。
以上配置文件及初始化的步骤是针对redhat系列的linux。对于deepin系统没有/etc/bashrc,与之对应的是/ect/bash.bashrc。而且我还发现deepin中没有~/.bashprofile这个文件,有的是~/.profile 文件,网上查得:若bash是以login方式执行时,读取/.bash_profile,若它不存在,则读取/.bash_login,若前两者不存在,读取~/.profile。
老陌想为什么不统一一下呢,把老陌都搞晕了~~