- 硬件、内核与shell
- 通过shell将我们输入的命令和内核通信,让内核可以控制硬件正确无误的工作
- shell只是提供用户操作系统的接口
- 狭义的shell是指命令行方面的软件;广义的shell包括图形界面的软件
- bash
- 全称Bourne Again SHell
- 是Bourne Shell的增强版本
- 查询当前linux可用的shell(/etc/shells文件)
- 至少有以下几个
- /bin/sh:已为bash取代
- /bin/bash:默认shell
- /bin/ksh:Kornshell,兼容于bash
- /bin/tcsh:整合C Shell,提供更多功能
- /bn/csh:已被tcsh取代
- /bin/zsh:基于ksh,功能更强大
-
- 系统某些服务运行中会通过该文件查询用户可用的shells
- 用户登录取得的shell
- bash shell的功能
- 当前linux的标准shell
- 命令记忆
- 默认记忆1000个命令
- 这一次登录的命令会暂存到临时内存中
- 注销后会把最近的HISTSIZE条命令记录在~/.bash_history文件中
- 如果同时打开多个bash,只有最后注销的bash的命令会写入文件中
- 登录后系统会主动读取~/.bash_history文件
- 但这个功能也有可能会被黑客利用,所以记忆的命令条数最好少一些
- history n
- 列出最近的n条命令
- 若不指定n,则为内存中的全部记忆
- history -c
- history [-raw] histfiles
- -r:将histfiles的记录读取到当前shell的history记忆中
- -a:将此次登录新增的history记忆加入histfiles中
- 若不给出histfiles,默认写入~/.bash_history
- -w:将目前的所有history记忆另存到histfiles中
- 若不给出histfiles,默认写入~/.bash_history
- 快速执行history中的命令
- !number
- !command
- 执行histroy中最近的一条开头为command的命令
- !!
- 命令与文件补全
- [tab]接在命令的第一个字后面为命令补全
- [tab]接在命令的第二个字后面为文件补全
- 命令别名设置(alias)
- 直接输入alias可以列出目前所有的命令别面
- 设置
- 如:alias lm='ls -al'
- 则lm命令代表了ls -al
- 取消
- 作业控制、前后台控制(job control, foreground, background)
- 程序脚本(shell script)
- 通配符(wildcard)
- type:bash内置命令
- 主要功能:找出“执行文件”(类似which)
- 基本语法:type [-tpa] name
- 不带参数:显示name为外部命令或是bash内置命令
- -t:只以下列字眼显示命令的意义
- file:外部命令
- alias:命令别名
- builtin:bash内置命令
- -p:只name为外部命令时才显示完整文件名
- -a:列出PATH路径中所有含name的命令(包括alias)
- 多行命令
- 用反斜杠(\)转义回车[Enter],使命令可以多行书写
- 变量
- 查看所有变量:set
- 包括环境变量和用户自定义变量
- 常见系统变量(以下变量不是环境变量,但与bash的操作环境有关)
- PS1:命令提示符的格式
- 设置与格式化字符串类似,有以下特殊符号
- \d:“星期 月 日”的日期格式
- \H:完整主机名
- \h:仅取主机名的第一个字段(以小数点 . 为分隔符)
- \t:显示24小时制时间“HH:MM:SS”
- \T:显示12小时制时间“HH:MM:SS”
- \A:显示24小时制时间“HH:MM”
- \@:显示12小时制的“am”“pm”
- \u:当前用户名
- \v:当前bash信息
- \w:完整工作目录名
- \W:工作目录的最后一个目录名,通过basename函数
- \#:登录以来执行的第几个命令
- \$:提示符,root的#和一般用户的$
- $:当前shell的PID
- ?:上一个执行命令的回传码
- OSTYPE,HOSTTYPE,MACHTYPE
- 环境变量
- 一般用大写字符表示
- 查看环境变量:env
- 常见环境变量
- HOME:用户的主文件夹
- SHELL:当前使用的shell
- HISTSIZE:历史命令记忆条数
- MAIL:邮件信箱文件
- PATH:执行文件查找路径
- LANG:语系数据
- RANDOM:产生一个0~32767的随机数
- 显示:echo
- 设置:直接用等号赋值
- myname=YaHei
- 若变量未设置,则默认内容为“空”(与空字符串('')不同)
- 规则:
- 等号两边不能有空格
- 只能是英文字母或数字,首字符不能为数字
- 若变量内容有空格,需要用双引号或单引号包含起来
- 双引号:保留特殊字符的特性
- 单引号:引号内的内容只做纯文本处理
- 可用反斜杠(\)转义特殊字符
- 引用其他命令的信息
- 可将命令包含在反引号(``)内
- 也可以将命令包含在$()内
- 如:version=`uname -r`
- 或:version=$(uname -r)
- 建议使用第二种方式
- 内容累加
- "$变量"累加内容
- ${变量}累加内容
- 如:PATH="$PATH":/home/bin
- 或:PATH=${PATH}:/home/bin
- 即将“:/home/bin”累加到变量PATH中
- 转换为环境变量:export
- 不带参数表示显示所有环境变量
- 以供父进程或其他子进程使用
- 子进程会继承父进程的环境变量,而不会继承自定义变量
- export PATH
- 取消:unset
- 语系变量(locale)
- 显示当前支持的所有语系
- 显示当前各种环境采用的编码
- 可以直接通过改变某个环境对应的语系变量
- 也可以直接通过设置LANG或者LC_ALL直接改变所有环境的编码
- 语系文件都放置在/usr/lib/local/目录中
- 整体系统默认的语系定义/etc/sysconfig/i18n
- 有效范围
- “环境变量”类似于“全局变量”
- “自定义变量”类似于“局部变量”
- 变量的内存配置关系
- 键盘读取:read
- 基本语法:read [-pt] variable
- -p:提供提示符
- -t:指定等待输入的秒数
- 声明类型:declare或typeset
- declare和typeset是一样的
- 基本语法:declare [-aixr] variable
- 不带参数:显示所有变量名称和内容
- -a:数组(array)
- -i:整型(integer)
- -x:环境变量
- -r:只读(readonly),通常需要注销重新登录才能恢复
- bash变量基本定义
- 默认类型为字符串
- 数值运算的精读最多仅能达到整数类型
- 文件系统及程序的限制:ulimit
- 基本语法:ulimit [-SHacdfltu] [配额]
- -H:hard limit,限制值
- -S:soft limit,警告值
- -a:不带配额,列出所有限制
- -c:core file,限制内核文件的最大容量
- 内核文件core file,进程错误时会将内存中的信息写成文件
- -f:当前shell可创建的最大文件容量(单位kb)
- -d:进程可用最大断裂内存(segment)容量
- -l:可用于锁定(lock)的内存量
- -t:可使用的最大CPU时间(秒)
- -u:单一用户可以使用的最大进程数
-
- 复原ulimit设置
- 注销再登录
- 也可以直接重新以ulimit设置
- 但一般用户如果用了ulimit -f,则只能继续减小文件容量而不能增加
- 变量的删除、替换
- ${变量#关键字}: 从前向后搜索,删除第一个符合关键字的最短数据(非贪婪)
- ${变量##关键字}: 从前向后搜索,删除第一个符合关键字的最长数据(贪婪)
- ${变量%关键字}: 从后向前搜索,删除第一个符合关键字的最短数据(非贪婪)
- ${变量%%关键字}:从后向前搜索,删除第一个符合关键字的最长数据(贪婪)
-
- ${变量/旧字符串/新字符串}:替换第一个匹配项
- ${变量//旧字符串/新字符串}:替换所有匹配项
- 变量的测试、设置
- 变量设置为“空”和“空字符串”是不同的概念
- var和str为变量,expr为字符串常量
- 不影响str
设置方式 | str为空 | str为空字符串 | str为非空字符串 |
var=${str-expr} | var=expr | var= | var=$str |
var=${str:-expr} | var=expr | var=expr | var=$str |
var=${str+expr} | var= | var=expr | var=expr |
var=${str:+expr} | var= | var= | var=expr
|
- 可能影响str
设置方式 | str为空 | str为空字符串 | str为非空字符串 |
var=${str=expr} | str=expr
var=expr | str不变
var= | str不变
var=$str |
var=${str:=expr} | str=expr
var=expr
| str=expr
var=expr | str不变
var=$expr
|
var=${str?expr} | expr输出到stderr | var= | var=$str |
var=${str:?expr} | expr输出到stderr | expr输出到stderr | var=$str |
- 命令查找顺序
- 相对/绝对路径的命令
- alias命令别名
- bash内置命令(builtin)
- $PATH中查找的第一个命令
- bash的登录和欢迎信息
- 登录信息
- /etc/issue文件
- 普通的字符和特殊字符
- 特殊字符
- \d:本机端日期
- \l:第几个终端机接口
- \m:硬件等级
- \n:主机网络名称
- \o:domain name
- \r:操作系统版本
- \t:本机端时间
- \s:操作系统名称
- \v:操作系统版本
- 用telnet连接主机时,显示的是/etc/issue.net而不是/etc/issue
- 欢迎信息
- /etc/motd文件
- 无特殊字符,直接给出文字信息
- bash配置文件
- login shell:通过完整的登录流程取得bash
- non-login shell:不需要重复登录的方式取得bash,如图形化界面下直接打开终端及其子进程
- 关于su命令
- 默认情况下取得的是non-login shell
- 加入参数-或-l或--login后取得的是login shell
- login shell只读取两个文件
- /etc/profile:系统整体设置
- 包含变量PATH、MAIL、USER、HOSTNAME、HISTSIZE等变量
- 并以此再去调用以下数据
- /etc/inputrc:记录自定义输入的按键功能、热键等有无声音功能等
- /etc/profile.d/*.sh:(需要r权限)规定接口的颜色、语系、部分命令别名等
- /etc/sysconfig/i18n:(是由/etc/profile.d/lang.sh调用的)语系的相关设置
- ~/.bash_profile或~/.bash_login或~/.profile:用户个人设置
- 按照上述顺序读取,只读其中一个
- 只是为了照顾用户的习惯
- non-login shell只读取~/.bashrc文件
- 不过有的发行版也会去读取/etc/bashrc文件或其他名字的文件
- 其中定义出以下数据
- 依据不同UID规定umask
- 依据不同的UID福鼎提示符(即PS1)
- 调用/etc/profile.d/*.sh
- 其他配置文件
- /etc/man.config
- 定义了man page的路径
- 有时候手动安装程序,需要将/usr/local/程序名/man加入到该配置文件中
- ~/.bash_history
- ~/.bash_logout
- 记录了注销bash后系统需要完成的操作
- 默认只进行清屏操作
- 还可以加入备份、清空暂存盘等操作
- 读入方式:source命令
- 如果修改了配置文件而不像注销重启
- 可以直接用source命令重新读取配置文件
- 终端机环境设置:stty,set
- stty(setting tty):终端机按键操作设置
- 基本语法1:stty [-a]
- 基本语法2:stty 操作 按键
- 其中^一般代表Ctrl组合键
- ^?代表[Backspace]
- 常见操作:
- eof:(默认^D)结束输入
- erase:(默认^?)向后删除字符
- intr:(默认^C)送出一个interrupt中断信号给当前程序
- kill:(默认^U)删除目前命令行上所有文字
- quit:(默认^\)送出一个quit信号给当前程序
- start:(默认^Q)在某个进程停止后,重启他的输出
- stop:(默认^S)停止目前屏幕的输出
- susp:(默认^Z)送出一个terminal stop信号给当前进程,即暂停当前命令
- set:终端机功能设置
- 基本语法:set [-uvCHhmBx]
- -u:(默认关闭)使用未设置变量时会显示错误信息
- -v:(默认关闭)讯息输出前会先显示讯息的原始内容
- -x:(默认关闭)命令被执行前会显示命令内容(前面有++符号)
- -h:(默认开启)与历史命令有关
- -H:(默认开启)与历史命令有关
- -m:(默认开启)与工作管理有关
- -B:(默认开启)与括号[]的作用有关
- -C:(默认关闭)使用>等数据流重定向时,若文件存在则不会被覆盖
-
- 若要取消设置,则将减号(-)改为加号(+)即可
- 通配符(wildcard)
- 注意,通配符与正则表达式不同,但有点类似
- *:代表0~∞个任意字符
- ?:代表一个任意字符
- []:代表一个括号内的任意字符,可以用减号(-)指定范围,可以用^符号表示反向选择
- bash下的特殊字符
- #:批注
- \:转义
- |:管道
- ;:连续命令的分隔符
- ~:用户主文件夹
- $:变量前导符
- !:逻辑“非”(not)
- /:目录路径分隔符
- >,>>:数据流重定向,输出导向
- <,<<:数据流重定向,输入导向
- '':字符串,不置换变量,纯文本
- "":字符串,可置换变量
- ``:可执行命令,也可用$()
- ():子shell的起止
- {}:命令块的起止
- 数据流重定向
- 标准输入输出
- standard output:输出命令回传的正确信息
- standard error output:输出命令回传的错误信息
-
- 标准输入(stdin):代码0,<或<<
- 标准输出(stdout):代码1,>或>>
- 标准错误输出(stderr):代码2,2>或2>>
- /dev/null:垃圾桶黑洞设备
- 可以吃掉任何导向这个设备的信息
- 比如想要忽略错误信息:
- find /home -name .bashrc > list_right 2> /dev/null
- 将stdout和stderr分别写到两个文件去
- find /home -name .bashrc >list_right 2> list_error
- 将stdout和stderr写到同一个文件去
- find /home -name .bashrc > list 2>&1
- find /home -name .bashrc &> list
- 用cat命令创建一个文件
- 指定输入某段字符后即可离开(无需ctrl + d)
- cat > file << "eof"
- 那么当file读到eof时即会离开,但是"eof"并不会写入文件中
- 用stdin代替键盘输入来用cat命令创建一个文件
- 重定向的常用情况
- 保存屏幕输出的信息
- 不希望后台程序的信息干扰屏幕输出
- 保存某些例行程序的执行结果
- 忽略某些错误信息
- 分别获取错误信息和正确信息
- 命令执行的判别依据:; 、, 、&& 、 ||
- linux下的命令是从左至右执行的
- 一次执行多条命令(;)
- 如sync; sync; shutdown -h now
- 依据命令回传码($?)判断是否执行
- cmd1 && cmd2:只有cmd1正确执行才执行cmd2
- cmd1 || cmd2:只有cmd1不能正确执行才执行cmd2
- 有趣的是,对于($?),0表示正确执行,非0表示错误执行,这点与编程语言不同
- cmd1 && cmd 2 || cmd3
- 以cmd1为条件,若正确执行则执行cmd2,若错误执行则执行cmd3
- 类似C语言的cmd1?cmd2:cmd3;
- cmd1 || cmd2 && cmd3
- 以cmd1为条件,若正确执行则执行cmd3,若错误执行则执行cmd2
- 若cmd2正确执行,则接着执行cmd3
- 管道命令(pipe)
- 嗯……类似于过滤筛选功能
- (|)仅能处理前一个命令回传的正确信息,不能处理错误信息,其后的命令必须是管道命令(即能处理stdin的命令)
- 文本命令
- 选取命令:cut、grep
- cut:取下各一行的匹配部分
- 基本语法1:cut -d '分隔符' -f fields
- 用于有分隔符的信息
- -d:指定分隔字符,注意(' ')只能匹配单一空格不能匹配多个空格
- -f:将-d分隔的结果中的第fields段取出(从1记起),多个字段用逗号(,)隔开
- 基本语法2:cut -c 字符范围a-b
- 用于排列整齐的信息
- 取出每一行的第a-b的信息,若从头取则省略a,若取到底则省略b
- 如:
- export | cut -c 12-
- last | cut -d ' ' -f 1
- grep:取下匹配的所有行
- 基本语法:grep [-acinv] [--color=auto] '查找字符串' filename
- -a:将binary文件以text文件的方式查找
- -c:计算找到的“查找字符串”的次数
- -i:忽略大小写
- -n:输出行号
- -v:反向选择
- --color=auto:将找到的关键词部分加上颜色显示
- 如:
- last | grep 'root'
- last | grep 'root' | cut -d ' ' -f 1
- 排序命令:sort、wc、uniq
- sort:排序
- 基本语法:sort [-fbMnrtuk] [file or stdin]
- -f:忽略大小写
- -b:忽略最前面的空格部分
- -M:以月份的名字来排序(JAN, DEC等)
- -n:用纯数字来排序(默认根据字符,即'20'<'3')
- -r:反向排序
- -u:uniq,重复数据只出现一次
- -t:分隔符,默认用[tab]
- -k:以(分隔符)指定字段排序(从1记起)
- 如:
- cat /etc/passwd | sort -t ':' -k 3
- uniq:重复数据仅显示一次
- 基础语法:uniq [-ic]
- 如:
- last | cut -d ' ' -f 1 | sort | uniq -c
- wc:统计
- 基本语法:wc [-lwm]
- 不带参数:分别列出行数、字数、字符数
- -l:仅列出行数
- -w:仅列出字数
- -m:仅列出多少字符
- 双向重定向:tee
- 同时将数据流送到文件和屏幕
- 基本语法:tee [-a] file
- 如:
- last | tee last.list | cut -d ' ' -f 1
- 将数据流存入last.list
- 将数据流通过管道cut处理后输出到屏幕
- 字符转换命令:tr、col、join、paste、expand
- tr:删除或替换部分文字
- 基本语法:tr [-ds] SET1 [SET2]
- 不带参数:用SET2取代SET1
- -d:删除SET1
- -s:替换掉重复的字符
- 可用正则表达式
- 如:
- last | tr '[a-z]' '[A-Z]'
- cat /root/passwd | tr -d '\r' > /root/passwd.linux
- \r是tr命令中定义的特殊字符,代表DOS断行字符^M
- col:将tab转换为空格、去除转义字符(将man page转存为文本文件)
- 基本语法:col [-xb]
- -x:将tab转换成对等的空格键
- -b:在文字内有反斜杠(\)时,仅保留反斜杠最后接的那个字符(去除转义字符?)
- 如:
- man col | col -b > /root/col.man
- join:将两个文件中的相同数据的行拼在一起
- 基本语法:join [-ti12] file1 file2
- -t:分隔符,拼起来的数据也用该分隔符隔开,默认为空格
- -i:忽略大小写
- -1:后接第几个字段,代表file1的分析字段
- -2:后接第几个字段,代表file2的分析字段
- 如:
- join -t ':' -1 4 /etc/passwd -2 3 /etc/group
- 用join之前需要对文件进行排序(sort),否则可能略过某些数据
- paste:将两个文件的对应行直接贴在一起
- 基本语法:paste [-d] file1 file2 .......(可以多个文件)
- -d:分隔符,默认[tab]
- file1和file2可以写成-,代表stdin
- expand:将tab转换为任意个数空格(可不对等)
- unexpand:将指定数量的空格转换为tab
- 切割命令:split
- 基本语法:split [-bl] file PREFIX
- -b:按大小切割,后接单个文件大小,可加单位b,k,m等
- -l:按行切割,后接行数
- PREFIX:前导符,作为切割文件的前导文字
- 如PREFIX为xxx时
- 切割后文件会依次命名为xxxaa, xxxab, xxxac依次类推(这样至少可以表示26*26个文件)
- 合并切割文件
- 直接用数据流重定向即可
- cat PREFIX* >> file
- 参数代换:xargs
- 常用于不支持管道命令的命令
- 读入stdin数据,以空格或断行符将数据分隔成command的arguments
- 基本语法:xargs [-Oepn] command
- -O:将stdin中的特殊字符还原成一般字符
- -e:后接终止字符串,当分析到该字符串时即停止工作,该字符串不会作为参数代入
- -p:在执行每个命令参数时,会询问是否执行“.........”command
- -n:后接个数,表示每次命令使用几个参数
- 如:
- find /sbin -perm +7000 | xargs ls -l
- 关于减号-
- 代表stdin或stdout
- 如:
- tar -cvf - /home | tar -xvf -
- 将/home打包到-(stdout)
- 再将-(stdout)解压出来