BASH
Console,tty,terminal,shell
In unix terminology, the short answer is that
- terminal = tty = text input/output environment
- console = physical terminal
- shell = command line interpreter
控制台,终端和tty联系密切。最初,它们代表一台可以与计算机进行交互的设备:在unix的早期,它代表(teleprinter)电传打字机-外形类似打印机,也叫teletypewriter,或者缩写为"tty"。“终端”是从电子的角度看,“控制台”是从设备的角度看。在unxi的最初阶段,键盘和显示器成为终端的标准。
而shell,在unix系统管理中,一个用户的shell是指他们登录时被调用的程序。普通用户拥有一个命令行shell,但限制权限的用户会拥有一个restricted shell或者只能运行特定命令的shell(如仅用于文件传输的账户)。
所以我的个人理解是,shell是系统管理中真正的“中间件”,它接收来自终端等的信号输入,调用内核提供的函数等帮助我们与系统进行交互。所以说shell接受来自用户的指令,来与核心进行沟通,比较常见的是命令行界面的shell,当然也有图形界面等的。它自身也就是一个程序,特性是它能调用其他程序。
shell的历史
最初的shell是Bourne SHell(sh),过后的其他shell基本都是按这个来的,包括当前linux使用的Bourne Again SHell(bash),是该原始版本的增强版。
简单看一下我们的/etc/shells下的几种可用的shell。linux默认使用的是/bin/bash。/bin/sh已经被/bin/bash所替代了。
bash的优点
- 命令记忆功能,~/.bash_history中存放有上一次执行的历史记录,不过这次登陆的命令都暂存在内存中,等到注销才会改写这个文件。
- 命令补全的功能,TAB键
- 命令别名设置【alias】
- job control,foreground,background
- 程序脚本【shell script】
- 通配符
bash shell 内置指令 type
bash指令的类型有三种,file表示为外部命令,alias表示别名,builtin表示bash内置的命令功能。该指令是为了找出“执行文件”而不是一般的文件名。
-a 可以查看执行的查找循序,-t 表示类型
shell 变量
shell环境变量可以理解为全局变量,就是子程序也可以获取到,还有一种是自定义变量相当于是局部变量。
变量的设置规则
- 变量与变量内容用=连接,不能有任何空格符,变量名为英文字母与数字但是数字不能开头,正确如 name=yang
- 内容可以用“”引起来,但是保留特殊符号$等的有效性,单引号‘’则仅为纯文本仅,如"var="lang $LANG" --> echo $var -->"lang en_US", ar='lang $LANG' -->echo $ar--> "lang $LANG"
- 可以使用转义字符 '\'
- ``反引号内的命令会先执行,如 cd /lib/`uname -r`/kernel,会得到值再进行cd命令
变量常涉及的命令
- 通过env或者export都是可以查询得到环境变量的
- 其中有一些值比如说HOME表示用户主文件夹,SHELL表示当前执行的是哪一个shell,HISTSIZE表示记录的条数,PATH表示执行文件查找的路径,RANDOM表示随机数内容0~32767
- 通过set查看所有的变量,包含了环境变量和自定义变量
- PS1变量是提示符的设置,\w是完整工作目录设置,\W是列出最后一个目录等等
- $变量表示当前bash的pid
- ?变量表示上一条命令的return编码符号,一般正常返回都是0
- export 可以将自定义变量转变为环境变量
- read 【-pt】variable -p 后面接提示符,-t 接等待秒数 ,最后接一个变量名
- read -p "please enter your name" -t 30 named
- declare 【-aixr】variable
- a 声明该变量为数组变量
- i 声明该变量为数字类型
- x 声明该变量为环境变量
- r 声明该变量为只读不可修改
- ulimit 监管用户能操控的系统资源配额
命令别名和历史命令
alias lm='ls -l | more'
history
!number 表示执行第number条命令
!! 执行上一条命令
!al 执行最近以al开头的命令
bash环境配置文件
大概流程如下
- /etc/profile
- /etc/inputrc
- /etc/profile.d/*.sh
- /etc/sysconfig/i18n
- ~/.bash_profile
- ~/.bashrc
- /etc/bashrc
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>>
输出重定向意义是将命令数据输出内容输出到指定的文件或者设备上。这与后面管道符号的意义是不同的,管道改变输入输出是为了程序之间的内容传递。
find /home -name .*c > list 2> list_err 将找到的不同结果存放在不同的文件内
find /home -name .*c >list 2>&1
find /home -name .*c &>list 这两者都表示同时输出到list中
cat > catfile <~/.bashrc 用stdin替代键盘输入以创建新的文件
cat > catfile <<"eof" 当输入到eof关键字就可以终止输入了
命令之间加上 ; 表示不考虑关联性连续命令执行
命令之间加上 && 或者 || 表示有一定的逻辑关系
管道命令
使用 | 将前一个命令的stdout变为后一个命令的stdin,管道命令仅会处理stdout但是对于std err 会忽略,必须能够接受来自前一个命令的数据成为stdin继续处理才行。
cut 【-dfc】
-d 分隔符 与 -f 一起使用
-f 切割后选择第几段,从1开始
-c n1-n2 取出字符区间【n1,n2】,n2可以不写
grep 【-acinv】【--color=auto】'char' filename
wc 行数,字数,字符数
tee 双重定向,将相同的内容一份导向file,一份导向了屏幕
last | tee last.txt | more
- 减号,可以用来代替上一个命令的stdout的内容作为这次的stdin