什么是shell:
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。
Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户经过这个界面访问操做系统内核的服务。html
Shell 脚本:
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
业界所说的 shell 一般都是指 shell 脚本,但shell 和 shell script 是两个不一样的概念linux
Ps:正则表达式
1.不一样 shell 的命令有所区别,使用时候须要注意。 2.网上的教程一般都是以 bash 做为学习的标准。 3.因为 第1点,使用命令时候若是不清楚,先查询内置的命令帮助文档。(如: COMMAND -h 或者 man COMMAND 等 ) 4.善用 tab 键的自动补充功能, COOMAND -(tab键,列出全部参数) 例如: bash 中有 help 命令, history 命令有 -c 参数 zsh 5.8 中是没有 help 命令, 而且 history 命令也没有 -c 参数
查看shell版本的几种方式:shell
1. shell --version, 例如: zsh --verison 或者 bash --verison 2. $SHELL_VERSION, 例如: $ZSH_VERSION, 这里好像只有 zsh 有个这个
注意,由于有些命令在 Linux 中有 MacOS 没有,网上找到的有时候比较模糊,因此不必定彻底正确,我尽可能区分不一样的。数组
符号 | 含义 |
---|---|
| | 管道符 |
&& | 表明 and 同时运行多个命令, 使用它。 |
\ | 容许您在新行中继续编写命令 Bash语法。 |
* | 匹配路径下,全部文件或者文件夹名称 |
<< EOF [重定向文件] ...内容 EOF | 分界符, EOF 不必定是 它,只是一般用它做为分界符标识 ; 结合cat进行内容的追加 |
> | 获取命令的标准输出并将其重定向到一个文件中(将覆盖整个文件) |
2> | 获取命令的错误输出并将其重定向到一个文件中(将覆盖整个文件) |
&> | 获取命令的标准和错误输出并将其重定向到一个文件中(将覆盖整个文件) |
< | 将文件的内容读入命令的输入 |
>> | 将文本或命令标准输出追加到文件的最后一行 |
2>> | 将文本或命令错误输出追加到文件的最后一行 |
&>> | 将文本或命令标准和错误输出追加到文件的最后一行 |
在传统的 shell 中是没有 花括号扩展这个功能的.bash
$ echo a{p,c,d,b}e # 输出结果: ape ace ade abe $ echo {a,b,c}{d,e,f} # 输出结果: ad ae af bd be bf cd ce cf $ ls *.{jpg,jpeg,png} # 首先扩展为*.jpg *.jpeg *.png,而后解析通配符
当花括号扩展和变量扩展一块儿使用时,变量扩展解析于花括号扩展以后。有时有必要使用内置的 eval 函数:app
$ start=1; end=10 $ echo {$start..$end} # 因为解析顺序,没法获得想要的结果 # 输出结果: {1..10} $ eval echo {$start..$end} # 首先进行变量扩展的解析 # 输出结果: 1 2 3 4 5 6 7 8 9 10
首先它们均可以用来解决bash 中字符串中的空格问题。less
字符串引号 | 描述 |
---|---|
'' | 原样输出字符串,当咱们须要原样输出字符串的时候使用, 例如: a=1; echo '$a' // $a |
"" | 参数替换, 例如: a=1; echo "$a" // 1 |
`` | 命令替换和参数替换, 例如: echo seq 1 10 ; 主要是为了命令替换, 若是只替换了参数,echo 输出的时候会提示找不到命令. |
echo `seq 1 10` # 输出结果: 1 2 3 4 5 6 7 8 9 10 echo seq 1 10 # 输出结果: seq 1 10
格式:编辑器
# f 变量名 # * 当前文件夹下的全部文件, 这个是 glob 模式 # 循环输出文件 for f in *; do .... # file f done
# i 变量名 # `seq 1 10` 1 到 10, seq 1 10 是生成1 到 10,可是这里要加上 ``,不然输出的是 seq 1 10 # 循环输出 i for i in `seq 1 10`; do .... echo $i done # 1 # 2 . . . # 10
下面的例子如下面这个变量为例子:ide
str="这是一个字符串变量"
变量赋值格式:
name=value
Ps:
1. = 与 name 和 value 之间不能有空格;
2.变量的值若是有空格,必须用引号包含
使用变量格式: $str /// 这是一个字符串变量
在 "" 字符串中使用变量, 获取到变量值: "$str" /// 结果是 这是一个字符串变量
在 '' 字符串中使用变量, 获取到: '$str' /// 结果是 $str
aa=123 #定义变量aa的值是123 aa="$aa"456 #重复定义变量aa的值是源aa的值加上456 echo $aa # 输出结果: 123456 #aa的值已经变成了123456 aa=${aa}789 echo $aa # 输出结果: 123456789 # 在进行变量叠加时也可使用${变量名}格式 # 在进行变量叠加时,变量名须要用双引号或 ${} 包含
set 命令能够用来查看系统中的全部变量(用户自定义变量和环境变量)和设定 Shell 的执行环境
1.直接set命令列出来全部变量
2.为了查找变量是否存在使用 grep 命令:
set | grep -e 正则表达式
unset 命令删除变量: unset str
由于是删除变量,因此不须要带 $
下面的例子如下面这个变量为例子:
str=123asd456
格式:
${var:offset:length}
~ % str=123asd456 ~ % echo ${str:2:4} 3asd ~ % echo ${str:4} sd456 ~ % echo ${str:-4} 123asd456 ~ % echo ${str: -4} d456
pattern是glob风格的正则(名称: glob 模式 \ glob 模式匹配)
有点像字符串删除(删除行首或行尾)
格式:
pattern是glob风格的正则(名称: glob 模式 \ glob 模式匹配)
格式:
输出PATH换行:
echo ${PATH//:/\\n}
格式:
在当前 shell 环境下读取并执行FileName中的命令。
*注:source命令也称为“点命令”,也就是一个点符号(.)。source命令一般用于从新执行刚修改的初始化文件,使之当即生效,而没必要注销并从新登陆。该命令一般用命令“.”来替代
格式:
source filename . filename(中间有空格)
列出全部命令
参数 | 描述 |
---|---|
-c | 列出全部可用的命令 |
-a | 列出可用的全部alias |
-b | 显示全部 shell 内置命令 |
-k | 显示全部 shell 关键字 |
-A | 显示全部 shell 函数 |
alias命令用来设置指令的别名。咱们可使用该命令能够将一些较长的命令进行简化。使用alias时,用户必须使用单引号''
将原来的命令引发来,防止特殊字符致使错误。
alias命令的做用只局限于该次登入的操做。若要每次登入都可以使用这些命令别名,则可将相应的alias命令存放到bash的初始化文件/etc/bashrc
中
执行 alias 或者 alias -p, 能够显示本身设定的 alias 命令列表(有些shell 没有 -p 参数,直接执行 alias)
快速生成数字列表,seq 仅适用数字.
# 除非另有指定,不然 `seq` 始终以 1 开头 echo `seq 3` # 1 2 3 echo `seq 3 6` # 3 4 5 6
指定增量
# 3 开始的数 # 4 指定增量 # 20 最大的数,由于19 增量 4 后是大于 20,因此最后输出20 echo `seq 3 4 20` # 3 7 11 15 19
# 20 开始的数 # -4 指定减量 # 3 最小的数,由于4 减量 4 后是小于 3,因此最后输出3 echo `seq 20 -4 3` # 20 16 12 8 4
a是开始,b是结束; 快速生成序列,适用于任何字符(中文也适合).
bc 命令是任意精度计算器语言,一般在linux下当计算器用。
它相似基本的计算器, 使用这个计算器能够作基本的数学运算
# scale 设置小数位,经过 / 1 进行 echo 'scale=2; (2.777 - 1.4704)/1' | bc # 结果: 1.30, floor
用于执行一个或多个表达式,变量计算中不须要加上 $ 来表示变量。若是表达式中包含了空格或其余特殊字符,则必须引发来
格式:
let arg [arg ...]
例如:
$ a=1 b=2 $ let a=a+4 b++ $ echo $a $b # 结果: 5 3
内部命令自己一开机就会随bash加载到内存中
而外部命令只会运行后才会加载到内存中能够用hash命令看到
1.经过 help COMMAND 或者 man COMMAND查看命令帮助
2.若是 man COMMAND 看到的是 shell 的命令帮助,就使用help.
1.一般是 COMMAND -h 或者 -—help
2.man COMMAND 或者 info COMMAND
chown(英文全拼:change owner)命令用于设置文件全部者和文件关联组的命令
格式:
chown [-cfhvR] [--help] [--version] [user][:group] file...
例子:
# 处理当前目录下的全部文件夹和文件 # ':' 前面的 $(whoami) 是 要设置的拥有者用户是谁,$(whoami)输出当前登陆用户 # ':' 后面的是 要设置的 群体的使用者 # * 匹配当前目录的全部 $ chown -R $(whoami):amdin * # 只改变 关联组,不改变全部者 $ chown :512 ./Readme.md
参数:
参数 | 描述 |
---|---|
-R | 处理指定目录以及其子目录下的全部文件 |
user | 新的文件拥有者的用户 ID 或者用户名 |
group | 新的文件拥有者的使用者组(group) 使用者组id 或者 使用者组名称 |
-c | 显示更改的部分的信息 |
-f | 忽略错误信息 |
-h | 修复符号连接 |
-v | 显示详细的处理信息 |
--help | 显示辅助说明 |
--version | 显示版本 |
Note:
chmod命令
用来变动文件或目录的权限
权限范围的表示:
表示 | 描述 |
---|---|
u | User, 即文件或目录的拥有者 |
g | Group,即文件或目录的所属群组 |
o | Other,除了文件或目录拥有者或所属群组以外,其余用户皆属于这个范围 |
a | All,即所有的用户,所属群组以及其余用户 |
r | 读取权限,数字代号为 4 |
w | 写入权限,数字代号为 2 |
x | 执行或切换权限,数字代号为 1 |
- | 不具有任何权限,数字代号为 0 |
s | 特殊功能说明: 变动文件或目录的权限 |
选项:
选项 | 缩写 | 描述 |
---|---|---|
--changes | -c | 效果相似 -v 选项,但仅回报更改的部分. |
--quiet 或者 --silent | -f | 不显示错误信息. |
--recursive | -R | 递归处理,将指令目录下的全部文件及子目录一并处理. |
--verbose | -v | 显示指令的执行过程 |
--reference=<参考文件或目录> | 把指定文件或目录的全部群组所有设成和参考文件或目录的所属群组相同 | |
<权限范围>+<权限设置> | 开启权限范围的文件或目录的该选项权限设置 | |
<权限范围>-<权限设置> | 关闭权限范围的文件或目录的该选项权限设置 | |
<权限范围>=<权限设置> | 指定权限范围的文件或目录的该选项权限设置 |
扩展:
/etc/passwd
文件中./etc/shadow
文件下./etc/group
内.权限图片分析:
Refs:
参考: rsync 用法教程 阮一峰
*1.rsync 是一个经常使用的 Linux 应用程序,用于文件同步. *2.它能够在本地计算机与远程计算机之间,或者两个本地目录之间同步文件(但不支持两台远程计算机之间的同步). *3.它也能够看成文件复制工具,替代`cp`和`mv`命令. *4.它名称里面的`r`指的是 remote,rsync 其实就是"远程同步"(remote sync)的意思. *5.与其余文件传输工具(如 FTP 或 scp)不一样,rsync 的最大特色是会检查发送方和接收方已有的文件,仅传输有变更的部分(默认规则是文件大小或修改时间有变更). *6.若是是本地和远程同步,传输双方都必须安装 rsync. *7.默认状况下,rsync 只确保源目录的全部内容(明确排除的文件除外)都复制到目标目录。它不会使两个目录保持相同,而且不会删除文件。
基本命令格式:
# -r: 表示递归,即包含子目录, -r 是必须的,不然 rsync 运行不成功.(可使用 -a 代替 -r). # source 为多个时候,多个 source 都会同步到 destination. # 目标目录 destination 若是不存在,rsync 会自动建立. $ rsync -r source1 [..source2] destination
路径注意事项 Ps:
# source 后面带 / 和不带 / 是两回事 $ rsync -r source1 destination # destination/source1 , destination 下面的子目录 source1 跟 源目录 source1 内容一致。 $ rsync -r source1/ destination # destination 的内容跟 源目录 source1 的内容一致
目标目录成为源目录的镜像副本:
# 第7点描述的意思,就是在没有特定参数的状况下,rsync 只是将 源目录的内容 复制到 目标目录,确保源目录有的内容,目标目录都会有。 # 为了确保 源目录 没有的内容,目标目录都不要存在使用下面参数 # --delete 这将删除只存在于目标目录、不存在于源目录的内容。 $ rsync -r --delete source/ destination
模拟同步结果,而且输出到终端:
# -n: 参数模拟命令执行结果, 若是只是 -n 不带 v,咱们在终端上,什么都看不到. # -v: 将结果输出到终端.
参数列表:
参数 | 参数简写 | 描述 | 例子 |
---|---|---|---|
--archive | -a | 1.除了能够递归同步之外,还能够同步元信息(好比修改时间、权限等); 2.像 -rlptgoD (no -H) 参数. 3.因为 rsync 默认使用文件大小和修改时间决定文件是否须要更新,因此-a比-r更有用 |
|
--recursive | -r | 递归目录 | |
-D | 保持设备文件信息 | ||
-P | 显示同步过程,好比速率,比-v更加详细 | ||
--copy-links | -L | 同步软连接时会把源文件给同步 | |
--links | -l | 保留软链接 | |
--perms | -p | 保持文件的权限属性 | |
--times | -t | 保持文件的时间属性 | |
--owner | -o | 保持文件的属主 | |
--group | -g | 保持文件的属组 | |
--delete | 删除只存在于目标目录、不存在于源目标的文件,即保证目标目录是源目标的镜像 | ||
--human-readable | -h | 表示以人类可读的格式输出. | |
--verbose | -v | 1. -v参数表示输出细节。 2. -vv表示输出更详细的信息. 3. -vvv表示输出最详细的信息。 |
|
--dry-run | -n | 模拟执行结果,不真正执行 | |
--exclude | 按照模式,排除同步的文件/文件夹 | 1. 单个排除模式: --exclude 'example/' 或者 --exclude='example/' 2. 多个排除模式: --exclude 'example/' --exclude 'example.txt' 3. 多个排除模式: --exclude={'example.txt','example/'} |
|
--exclude-from | 从指定的文件中读取排除模式, 每一个排除模式为一行 | --exclude-from='exclude-file.txt' | |
--include | 1.按照模式,不排除文匹配的文件/文件夹. 2.一般跟 --exclude 一块儿使用, 为了保留被 --exclude 模式匹配, 但不但愿被排除掉的文件/文件夹. 3.使用这个参数的好处是不须要高度匹配 --exclude 的排除模式,而且在不清楚文件类型时候,确认同步的文件类型保留就好了. |
1. 单个模式: --include 'example/' 或者 --include='example/' 2. 多个模式: --include 'example/' --include 'example.txt' 3. 多个模式: --include={'example.txt','example/'} |
|
--include-from | 从指定的文件中读取不排除模式, 每一个不排除模式为一行 | --include-from='include-file.txt' | |
--max-size | 设置传输的最大文件的大小限制 | 好比不超过200KB(--max-size='200k') | |
--min-size | 设置传输的最小文件的大小限制 | 好比不小于10KB(--min-size=10k) | |
--itemize-changes | -i | 表示输出源目录与目标目录之间文件差别的详细状况 | |
--prune-empty-dirs | -m | 指定不一样步空目录 | |
--update | -u | 表示同步时跳过目标目录中修改时间更新的文件,即不一样步这些有更新的时间戳的文件. | |
--ignore-non-existing | --existing | 表示不一样步目标目录中不存在的文件和目录。 | |
--progress | 表示显示进展 | ||
--size-only | 表示只同步大小有变化的文件,不考虑文件修改时间的差别 | ||
--suffix | 指定文件名备份时,对文件名添加的后缀,默认是~ |
||
--remove-source-files | 表示传输成功后,删除发送方的文件 | ||
--daemon | 运行一个 rsync 的守护进程 |
描述:
1.date命令能够用来显示或设定系统的日期与时间,在显示方面,使用者能够设定欲显示的格式,格式设定为一个加号后接数个标记 。 2.如果不以加号做为开头,则表示要设定时间,而时间格式MMDDhhmm[[CC]YY][.ss],其中 MM 为月份,DD 为日,hh 为小时,mm 为分钟,CC 为年份前两位数字,YY 为年份后两位数字,ss 为秒数。 3.这种方式只是临时修改系统时间,当系统从新启动的时候就会还原. 4.普通用户是不被授予修改时间的权限的, 只有超级用户才能用 date 修改系统时间。
语法格式:date [选项] [+输出形式]
输出形式字符串(必须有加号): +"%Y-%m-%d" 或 "+%Y-%m-%d"
参数 | 简写参数 | 描述 |
---|---|---|
--date | -d | 格式: --date=datestr; 显示 datestr 中所设定的时间 (非系统时间) |
--set | -s | 将系统时间设为 datestr 中所设定的时间 |
--universal 或者 --utc | -u | 显示目前的格林威治时间 |
--help | 显示 date 命令帮助信息 | |
--rfc-3339 | --rfc-3339=date, 显示日期; --rfc-3339=ns, 显示日期时间(毫微秒); --rfc-3339=ns, 显示日期时间(秒) |
用于 建立日期目录和日期文件时候:
$ mkdir `date +"%Y-%m-%d"` # 2020-11-25/ $ touch `date +"%Y-%m-%d".txt` # 2020-11-25.txt
cat命令链接文件并打印到标准输出设备上,cat常常用来显示文件的内容
格式:
cat 文件1 [...文件n]
参数 | 功能 |
---|---|
-n或-number | 有1开始对全部输出的行数编号 |
-b或--number-nonblank | 和-n类似,只不过对于空白行不编号 |
-s或--squeeze-blank | 当遇到有连续两行以上的空白行,就代换为一行的空白行 |
-A | 显示不可打印字符,行尾显示“$” |
cat命令的反向,只反向从下到上,不反向左右.
用来查看一个文件的内容。当文件内容太多,一屏幕不能占下,而你用cat确定是看不前面的内容的,那么使用more就能够解决这个问题了。当看完一屏后按空格键继续看下一屏。但看完全部内容后就会退出。若是你想提早退出,只需按q键便可
head后直接跟文件名,则显示文件的前十行。若是加 –n 选项则显示文件前n行
后面直接跟文件名,则显示文件最后十行。若是加-n 选项则显示文件最后n行。
切换目录
格式:
cd 目录路径
建立文件
格式:
touch 文件名
移动或者重命名
复制
新建文件夹
建立多级目录:
# -p 目录存在就忽略,不存在就建立 $ mkdir -p aaa/bbb/ccc # 按日期时间建立多级目录 $ mkdir `date +"%Y-%m-%d"`/`date "+%H-%M"`
删除文件夹
删除文件夹或者文件
Ps:这个命令使用的时候,要特别当心(打醒12分精神来使用它); 不然,很容易就从删库到跑路.
参数 | 简写参数 | 描述 |
---|---|---|
--dir | -d | |
--force | -f | 强制删除, 无需确认 |
--recursive | -R 或者 -r | 递归删除子目录 |
-i | 在删除前须要确认 | |
-I | 在删除超过三个文件或者递归删除前要求确认。此选项比-i 提 | |
示内容更少,但一样能够阻止大多数错误发生 | ||
--no-preserve-root | 不特殊对待 "/" | |
--preserve-root | 不容许删除"/"(默认) |
清空文件夹(不删除): rm -rf 文件夹路径/ 文件夹路径/.
查看文件类型
列出路径下面的文件夹和文件
参数 | 简写 | 功能 |
---|---|---|
--all | -a | 全部文件夹和文件(包括隐藏的文件夹和文件,默认不显示隐藏的文件夹和文件) |
-1 | 竖立输出文件夹和文件名称 | |
-l | 文件夹或者文件的长清单 |
显示隐藏文件/文件夹
1.隐藏文件/文件夹以点开始.
2.因此咱们能够用ls .* 来显示。可是默认状况下,若是是目录,会显示目录包含的文件,此时能够用-d来避免 表示只显示第一层。
命令:
ls -d .*
du命令的英文全称是“Disk Usage”,即用于查看磁盘占用空间的意思。可是与df命令不一样的是du命令是对文件和目录磁盘使用的空间的查看,而不是某个分区.
语法格式:du [参数] [文件]
经常使用参数:
参数 | 简写参数 | 描述 |
---|---|---|
-all | -a | 显示目录中全部文件大小 |
-k | 以KB为单位显示文件大小 | |
-m | 以MB为单位显示文件大小 | |
-g | 以GB为单位显示文件大小 | |
--human-readable | -h | 以易读方式显示文件大小 |
--summarize | -s | 仅显示总计 |
--max-depth | -d | 最大目录深度 |
--time | show time of last modification of any file in the directory | |
--total | -c | produce a grand total |
--version | display version information | |
--help | 输出 du 命令的帮助文档 |
df命令的英文全称即“Disk Free”,顾名思义功能是用于显示系统上可以使用的磁盘空间。默认显示单位为KB,建议使用“df -h”的参数组合,根据磁盘容量自动变换合适的单位,更利于阅读.
df 能够查看一级文件夹大小、使用比例、档案系统及其挂入点,但对文件却无能为力.
平常广泛用该命令能够查看磁盘被占用了多少空间、还剩多少空间等信息.
语法格式: df [参数] [指定文件]
find指令怎么过滤掉没有查看权限的文件: find 路径 -name 文件名 2>/dev/null
open 命令用于打开文件(files)或者目录
参数:
参数 | 描述 |
---|---|
-a | a 就是 application, 指定用于打开文件/目录的应用程序 |
-b | 指定应用程序在打开文件时要使用的包标识符 |
-e | 用/Applications/TextEdit打开文件 |
-t | 使文件用默认的文本编辑器打开,经过LaunchServices肯定 |
-f | 从标准输入读取输入,并在默认文本编辑器中打开结果。经过发送EOF字符结束输入(类型Control-D)。 对于管道输出打开和在默认文本编辑器中打开它也颇有用 |
-F | 打开应用程序 “fresh”,也就是说,不恢复窗口。保存的持久状态会丢失,未命名的文档除外 |
-W | 致使open等待,直到它打开的(或已经打开的)应用程序退出。带-n标志使用时,容许打开到函数做为$EDITOR环境变量的适当应用程序 |
-R | 显示查找程序中的文件,而不是打开它们。 |
-n | 打开应用程序的一个新实例,即便一个实例已经在运行 |
-g | 不把应用程序带到前台 |
-j | 启动隐藏的应用程序 |
-h | 搜索标题位置,寻找名称与给定字符串匹配的标题,而后打开它。传递一个完整的头名称(好比NSView.h)以提升性能 |
-s | -h,部分或所有SDK名称使用;若是提供了参数值,则只搜索名称中包含参数值的sdk。不然,使用每一个平台中版本最高的SDK |
--args | 全部剩下的参数都经过argv参数传递给main()打开的应用程序。open工具没有打开或解释这些参数。 |
--stdin | 启动应用程序,并将stdin链接到PATH |
--stdout | 启动应用程序,并将stdout链接到PATH |
--stderr | 启动应用程序,并将stderr链接到PATH |
技巧:
$ # 命令行打开目录 或者 命令行使用应用打开目录或者文件,都是使用这个命令 $ # 打开当前目录 $ open ./ $ # 使用 IDEA 打开目录 $ # 第一种:(这一个种就是第二种的缩写,对了双引号,但少了空格的反斜杠,而且少了找到具体的执行的位置,推荐使用这种) $ open -a "IntelliJ IDEA" ./ $ # 第二种: $ # (这种是经过 Applications 下面的安装了的应用程序的打开路径,进行执行的, 不推荐使用这种,由于要找到具体执行的命令文件,这里 Contents 后面的执行文件位置是我本身找出来的, 其余应用程序的位置不必定在MacOS下面,也不必定名字很好认。例如: Sublime Text 是在 SharedSupport\bin 下面叫 subl的执行文件) $ open -a /Applications/IntelliJ\ IDEA.app/Contents/MacOS/idea
获取当前目录名称:
# 第一种方法: 使用 basename 命令, 嵌套 pwd $ echo $(basename `pwd`) # 第二种方法: 使用字符串删除, 贪婪匹配 $ echo ${PWD##*/}
显示当前目录完整路径: pwd
查看安装目录路径: which 软件名等
查看当前系统中全部可登陆shell的类型: cat /etc/shells
查看正在运行shell的类型: echo $SHELL
或者 echo $0
切换shell使用:
chsh -s shell位置路径 # 这样切换后,echo $SHELL 输出的依旧是以前的 shell, 这里要用 su 从新登陆一下用户
查看某个用户的Shell类型:
以root为例,执行 cat /etc/passwd | grep ^root 最后一个:号字段显示的即为root用户的登陆shell类型,为bash
查看shells 执行过的文件记录: history
查看文件内容时候过滤空行和 # 注释:
# '^$' 空行 # "|#" 将带有 # 的行号去掉 # -E 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式 # -v 反转查找 $ cat 文件名 | grep -Ev "^$|#"
上面仍是匹配不够好,下面是第二个版本的匹配
# "\ " 是匹配空格, # * 匹配前面0个或者多个 $ cat 文件名 | grep -Ev "^$|^#|^\ *#|^\ *//"
清屏: command(⌘) + k
删除整行: control(⌃) + c