Linux系统上的文件类型:
- -:常规文件,即f
- d:directory,目录文件
- b:block device,块设备文件[已block为单位,支持随机访问]
- c:character device, 字符设备[已character,支持线性访问]
major number: 主设备号,标识设备类型,进而确定要加载的驱动程序
minor number: 次设备好,标识同一种类型中的不同设备
早期设备号是8位二进制(0-255)表示,现在好像是16位 - symbolic link:符号链接文件
- p:pipe命名管道,
- s:socket 套接字文件
基本命令:
命令类型:
外部命令:文件系统有与之对应的二进制执行程序
内部命令: 一般是shell自带
type COMMAND:
内部:buildin
外部:显示为命令文件路径;
注意:命令还可以有别名,别名可以与原名相同,此时原名被隐藏。此时如果需要运行原命令,则使用\COMMAND
命令别名:
获取所有命令的别名:
alias
定义别名:
alias NAME='COMMAND'
注意:进对当前shell有效
撤销别名:
unalias NAME
which命令:
显示命令绝对路径
which --skip-alias 忽略别名
whereis命令:
显示命令地址,man手册地址
whereis -b 仅搜索二进制程序路径
whereis -m 仅搜索使用手册文件路径
who命令:
显示谁在登录
who -b 系统此次启动的时间
who -r 运行级别
w命令:
增强版的who命令
bash的基础特性
- 命令历史:shell进程会在会话中保存此```
本地初始化的项目 与 github 版本不一致, 导致无法提交
$ git pull origin master
- branch master -> FETCH_HEAD
fatal: 拒绝合并无关的历史
解决方法
在pull 时候, 添加–allow-unrelated-histories参数 即可.
$ git pull origin master --allow-unrelated-histories
来自 https://github.com/itaken/python-login-demo
- branch master -> FETCH_HEAD
Merge made by the 'recursive' strategy.
LICENSE | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
create mode 100644 LICENSE
- history 历史命令列表
- 定制history功能,可通过环境变量实现
- HISTSIZE : shell 进程可保留的命令历史的条数
- HISTFILE : 保留历史记录的文件
- HISTFILESIZE : 文件的大小
- 命令语法
- history [-c] [-d 偏移量] [n]
- history -anrw [文件名]
- history -ps 参数 [参数...]
- -c: 清空命令历史
- -d offset: 删除指定历史命令
- -r: 从文件读取历史命令至历史列表中
- -w: 把历史列表中的命令追加至历史文件中
- history n:显示最近的n条命令
- 使用历史列表中的命令
- !n : 使用历史列表中的第n条命令(中间没有空格)
- !! : 在一次执行上一次命令
- **!STRING** : 再一次执行命令列表中最近一个与STRING开头的命令
- **注意命令的重复执行有时需要幂等性支持**
- 调用上一条命令最后一个参数
- **esc+.**
- **!$**
- **alt+.**
- 控制命令历史记录的方式:
- HISTSCONTROL :
- ignoredups: 忽略重复的命令
- ignorespace: 忽略已空白字符的命令
- ignoreboth: 以上两者同时生效
- 修改环境变量的值
- NAME='value' 该方式仅对当前进程有效
2. 命令补全
3. 目录管理命令
- mkdir: make dir
- -p : 自动按需创建父目录
- -v : 显示详细创建过程
- -m : 设置权限
- rmdir : remove empty directories
- -p : 删除某目录后,如果其父目录为空则一并删除
- -v : 显示详细过程
- 问题1:如何创建/tmp/x/y1, /tmp/x/y2, /tmp/x/y1/a ,tmp/x/y1/b
- 问题2:如何创建 a_c, a_d, b_c, b_d;
---
###bash 基础特性:命令行展开
- ~ : 自动展开为用户的家目录,或制定用户的家目录
- {} : 可承载已逗号分割的路径列表,并能够展开为多个路径,花括号还可以嵌套
- 例如: /tmp/{a,b}    相当于 /tmp/a    /tmp/b
- 问题1: mkdir -pv /tmp/x/{y1/{a,b},y2}
- 问题2:mkdir -pv {a,b}_{c,d}
- 问题3:创建如下目录结构:
- /tmp/mysysroot/
- bin
- sbin
- etc
- sysconfig
- network-scripts
- usr
- bin
- sbin
- local
- bin
- sbin
- etc
- lib
- lib
- lib64
- var
- cache
- log
- run
mkdir -pv /tmp/mysysroot/{bin,sbin,etc/sysconfig/network-scripts,usr/{bin,sbin,local/{bin,sbin,etc,lib},lib,lib64},var/{cache,log,run}}
tree /tmp/mysysroot
tree : 显示目录树状结构
---
bash 基础特性:命令的执行状态结果
- 命令执行的状态结果
- bash通过状态返回值来输出此结果
- 成功: 0
- 失败: 1-255
- 命令完成之后,其状态返回值保存于bash的特殊变量$?中;
- 命令正常执行时,有的还会有命令返回值
- 根据命令及功能不同,结果各不相同
- 引用命令的执行结果
- $(COMMAND)
- 或 `COMMAND`
---
### bash 基础特性:引用
- 强引用: '' ,其内部的任何子串都直接显示
- 弱引用:"" , 进行变量替换
- 命令引用: ``或$()
---
### bash 基础特性:快捷键
- ctrl + a: 跳转至命令行首部
- ctrl + e: 跳转至命令行尾部
- ctrl + u: 删除命令行首至光标处所有内容
- ctrl + k: 删除命令行尾至光标出所有内容
- ctrl + l : 清屏
---
### bash基础特性 globing: 文件名通配
- 一种匹配模式 : 元字符
- * : 匹配任意长度的任意字串
- ? : 匹配
- [] : 匹配指定范围内的任意单个字符
- 有几种特殊格式
- [a-z] , [A-Z]: 默认不区分大小写
- [0-9] : 所有数字
- [a-z0-9] : 所有数字和字母
- [[:upper:]] : 所有大写字母 **外城中括号表示范围,与上面三个例子中括号意思一致**
- [[:lower:]] : 所有小写字母
- [[:alpha:]] : 所有字母
- [[:digit:]] : 所有数字
- [[:alpha:][:digit:]] : 所有数字和所有字母
- [[:alnum:]] : 所有数字和所有字母
- [[:space:]] : 所有空白字符
- [[:punct:]] : 所有标点符号
- [^] : 匹配指定范围外的任意单个字符
- 例如: [^[:upper:]] : 匹配大写字母之外的所有字符;[^0-9] : 匹配所有数字之外的所有字符、 [^[:alnum:]] : 匹配所有非正常字符的任意字符
- 练习
1. 显示/var 目录下所有l开头,已一个小写字母结尾,且中间出现一位任意字符的文件或目录
2. 显示/etc目录下已任意一位数字开头,且已非数字结尾的文件或目录
3. 显示/etc目录下已非字母开头,后面根一个字母及其它任意长度任意字符的文件或目录
4. 复制/etc目录下所有已m开头已非数字结尾的文件或目录,至/tmp/xiang目录
5. 复制/usr/share/man 目录下所有已man开头,后跟一个数字结尾的文件或目录至/tmp/man目录下
6. 复制/etc目录下所有已.conf结尾且已m、n、r、p开头的文件或目录至/tmp/conf.d/目录下
---
1. ls -d /var/l?[[:lower:]]
2. ls /etc/[0-9]*[^0-9] 或者 ls /etc/[0-9]*[^[digit]]
3. ls /etc/[^[:alpha:]][[:alpha:]]* -d 或 ls /etc/[^a-z][a-z]*
4. cp /etc/m*[^[:digit:]] -r /tmp/benbenxiang
5. cp /usr/share/man/man[0-9] -r /tmp/benbenxiang/
6. cp /etc/[mnrp]*.conf -r /tmp/benbenxiang/conf.d/
---
### bash基础特性:IO重定向及管道
程序:指令+数据
可用于输入的设备:
    文件、键盘设备、网卡等
可用于输出的设备:
    文件系统上的常规文件、网卡等。
程序有三种数据流:
    输入的数据流: <-- 标准输入(stdin), 默认情况是键盘
    输出数据流: --> 标准输出(stdout),默认显示器
    错误输出流: --> 错误输出(stderr),默认显示器
fd file descriptor: 文件描述符
    标准输入:0
    标准输出:1
    错误输出:2
**IO重定向**
    输出重定向:>
         特性:覆盖输出重定向
    输出重定向:>>
        特性:追加输出
    set -C : 仅对当前进程有效
        禁止覆盖输出重定向至已存在的文件
     强行覆盖输出: >|
    set +C : 关闭上述特性
    错误输出重定向(覆盖):2>
    错误输出重定向(追加):2>>
    合并正常输出流和错误输出流
         (1):&> (覆盖)或 &>> (追加)
         (2) :COMMAND > /path/somefile 2>&1
          :COMMAND >> /path/somefile 2>&1
        特殊设备: /dev/null :数据黑洞
    输入重定向:<
    tr 命令
        tr [option]... SET1 [SET2]
            吧输入的数据当中的自负,凡是在SET1定义范围内出现的,统统对位转换为SET2出现的字符。
        用法1:
            tr SET1 SET2 < /PATH/FROM/SOMEFILE
        用法2:
            tr -d SET1 < /PATH/FROM/SOMEFILE
            **注意: 不修改源文件**
     << : Here Document (此处创建文档)
        cat << EOF ... EOF
        cat > /PATH/TO/SOMEFILE << EOF ... EOF
    管道: 链接程序,实现将前一个命令的输出直接定向后一个程序当作输入数据流
         COMMAND | COMMAND2 | COMMAND3 | ...
        tee命令:COMMAND | tee /PATH/TO/SOMEFILE | tr 'a-z' 'A-Z'
            tee将输入流输出一份到文件,并且又输出一份到管道。
    练习1: 把/etc/passwd文件的前6行的信息转换为大写字母并输出
     head -n 6 /etc/passwd | tr 'a-z' 'A-Z'
**命令总结:tr tee**