Linux 基础之Shell--壳
一、什么是Shell?
1.1. 接口(Interface)
- 操作系统为用户提供两种接口:
- CLI(Command Line Interface) 命令接口:用户通过使用命令来规划和控制作业的执行,或者对系统进行管理。
- API(Application Programming Interface):应用程序接口:通过编程方式请求操作系统服务。
Shell 是命令行解释器,其实一个用C 语言写的程序,是介于用户与Linux内核之间的“翻译官”,即用户和Linux 内核之间的接口程序,当从Shell或其他程序向Linux 发送命令时,内核会做出相应的响应。
Shell 作为命令语言解释器,它拥有自己内建的Shell命令集,以交互式地解释和执行用户发送的命令,将请求的命令加以“翻译”并传给Linux内核。
Shell 作为程序设计语言,拥有自己的语法规则。可以通过shell调用系统内核的大部分功能执行程序、创建文档,并以并行的方式协调各个程序的运行。
1.2 Linux Shell 类别
shell | Command |
---|---|
Bourne Shell | /bin/sh |
C Shell | /bin/csh |
Korn Shell | /bin/ksh |
Bourne again Shell | /bin/bash |
Tenex C Shell | /bin/tcsh |
查看当前系统支持的Shell:
[root@localhost ~]# cat /etc/shells #当前系统支持的Shell
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
[root@localhost ~]# echo $SHELL # 当前的Shell
/bin/bash
1.3 Shell 功能
其主要负责解释命令行提示符下输入的命令。Shell 在分析命令时,将它分解成以空白符分开的符号,空白符:空格、换行符、。
1.3 Shell 执行规则
Shell 的处理命令的顺序为:
- 别名 alias
- 关键字 key
- 函数 function
- 内部命令
- 外部命令或外部脚本($PATH)
注 环境变量 $PATH:命令可搜索路径,一个能找到可执行程序的目录列表
如果用户输入的命令不是一个内部命令并在搜索路径下没有找到这个可执行文件,将会返回一个错误信息;反之,如果命令可以找到,拿了Shell的内部命令或应用程序将被分解成一系列的系统调用,进而传递给Linux 内核。
[root@localhost ~]# type history
history is a shell builtin #内部命令
[root@localhost ~]# type man
man is /usr/bin/man #别名
[root@localhost ~]# type ls
ls is aliased to `ls --color=auto'
[root@localhost ~]# type bash #关键字
bash is /usr/bin/bash
二、Shell 命令行
- Linux 系统常用的命令格式:
- command [flags] [argument1] [argument2] …
- 命令 可选项 参数 …
命令、选项、参数之间必须由一个或多个空格隔开,如 ls -al;cat test.file
命令的参数指定命令运行的对象,
命令的选项指定命令对象进行特殊的操作
选项,以“-”开始,有长短格式如 -a == --all ,且短格式之间可以合并,长短格式之间不可以合并。
Linux 系统的查看帮助的方式:
- 命令 --help(或-h)
- man [1-9] <命令>/<配置文件>
- pinfo <命令>
- /usr/share/doc/ #大多数软件说明文档保存于此
- Linux 命令行提示符:
- bash 中 # 表示超级用户
- $ 表示普通用户
bash 的实用功能 Tab 键:命令和文件名的自动补全功能
三、历史命令 history
bash 通过历史命令文件保留一定数目的已经在Shell里使用过的命令,数目取决于环境变量 HISTSIZE(默认保存1000条)。
在bash Shell 中执行的命令并不会立即直接将命令写入历史命令文件,而是先存放到内存的缓冲区中,该缓冲区称为历史命令列表,当bash 退出时将历史命令列表写入历史命令文件。或是执行 history -w 命令,要求bash 立即将历史命令列表写入历史命令文件。
- 登录系统后,历史命令列表会根据历史命令文件来初始化。环境变量 HISTFILE可以指定历史命令文件的名称,默认是登录用户家目录下的 .bash_history
history [-a|n|r|w] [filename]
选项 | 功能 |
---|---|
-a |
把当前的历史命令列表(记录)追加到历史命令文件 |
-c |
清空当前的历史命令列表(记录) |
-n |
把历史命令文件的内容加入到当前历史命令列表 |
-r |
把历史命令文件的内容更新(替换)当前历史命令列表 |
-w |
把当前的历史命令列表(记录)的内容写入历史命令文件,并覆盖历史命令文件的原来内容(慎重操作) |
filename |
把当前的历史命令列表(记录)写入到filename的文件 |
四、命令的别名 alias
别名,就是给复杂的指令创建一个简单的名字,当用户使用这个别名时,系统会自动的找到并执行这个别名对应的真实指令。
1.临时设置别名,仅本次登录有效
可以通过 alias 别名= 命令
alias 查看当前的别名列表:
[root@localhost ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
定义一个临时别名
[root@localhost ~]# alias showhome='ls -l /home' #定义一个临时别名
[root@localhost ~]# showhome #执行别名
total 0
drwx------. 3 test test 78 Apr 11 2018 test
[root@localhost ~]# unalias showhome #取消别名
[root@localhost ~]# showhome #再次执行报错
bash: showhome: command not found...
定义一个永久别名,每次登录都生效
通过编辑 ~/.bashrc 文件定义永久生效的别名
[root@localhost ~]# vim ~/.bashrc #编辑文件
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias showtmp='ls -l /tmp' #查看 /tmp 目录
[root@localhost ~]# showtmp #尝试执行别名命令
bash: showtmp: command not found...
[root@localhost ~]# logout #注销
[root@localhost ~]# showtmp #再次执行别名命令
total 1016
-rw-------. 1 root root 342778 Oct 31 21:23 cciCaQ59.out
-rw-------. 1 root root 342778 Oct 31 21:39 ccjyUrNg.out
-rw-------. 1 root root 342778 Oct 31 21:24 ccKOE45J.out
注: 定义别名时,等号两边不能有空格。等号右边的命令一般会包含空格或特殊字符,必须使用引号。