#42 Bash set 命令
Bash Linux 命令行 2018-01-11我写 Shell 脚本一般都是用 bash 执行,一般我会在头部插入 set -xue
命令, 助记:蛇血。
那么这个命令的作用是什么呢?
set 是 bash 提供的一个命令,用来管理 bash 的一些行为。
x
: 在执行命令前,输出所有命令,包括参数。u
: 遇到未定义变量时,报错。e
: 如果遇到错误,程序退出。
其他更多参数,参考:set --help
或 help set
。
coding in a complicated world
我写 Shell 脚本一般都是用 bash 执行,一般我会在头部插入 set -xue
命令, 助记:蛇血。
那么这个命令的作用是什么呢?
set 是 bash 提供的一个命令,用来管理 bash 的一些行为。
x
: 在执行命令前,输出所有命令,包括参数。u
: 遇到未定义变量时,报错。e
: 如果遇到错误,程序退出。其他更多参数,参考:set --help
或 help set
。
我并不是个 Vim 高手,但是我所掌握的知识对于轻量使用来说,也够用了。
这就是我能想到的全部 Vim 知识。
如果你是一个新手,看看这篇文章,应该可以快速入门 Vim,能解决所有简单编辑任务所会面临的问题。
避免由于意外操作而不知所措。
vim filepath
)就进入了这个模式,可以移动光标,执行一些指令模式切换:
i
进入插入模式;v
进入可视模式(字符);V
进入行可视模式;Ctrl
+ v
进入块可视模式;:
进入命令模式;Ctrl
+ g
进入选择模式;Ctrl
+ o
回退到可视模式;上下左右,翻页(PageUp,PageDown),删除(Backspace,Del)本身就可以用,就不用记快捷键了。
Key | Function |
---|---|
u |
撤销 |
dd |
删除当前行 |
3dd |
删除当前行 + 后面两行(共 3 行) |
>> |
缩进 |
<< |
取消缩进 |
== |
自动对齐 |
使用命令 5d 删除第五行
使用命令 5,10d 删除第 5 到第 10 行
Key | Function |
---|---|
gg |
跳到第一行 |
20gg |
跳到第 20 行 |
G |
跳到最后一行 |
10j |
往前跳 10 行 |
10k |
往后跳 10 行 |
hjkl 本身用来表示左上下右,所以...
Key | Function |
---|---|
yy |
复制当前行 |
3yy |
复制当前行 + 后面两行(共 3 行) |
yw |
复制当前单词和后面的空白字符 |
p |
Paste 粘贴在当前行、字符后面 |
P |
Paste 粘贴在当前行、字符前面 |
Key | Function |
---|---|
? |
向后搜索(正则) |
/ |
向前搜索(正则) |
# |
向后搜索当前单词,等同于输入 #\<xxx\> |
* |
向前搜索当前单词,等同于输入 /\<xxx\> |
\cp[a-z]*n
忽略大小写,搜索 p 开头,n 结尾的单词一般都有取消配置的 set noXXX
命令。
Key | Function |
---|---|
set nu |
显示行号 |
set paste |
粘贴模式(避免开启自动缩进时,会弄乱粘贴内容) |
set ignorecase / set ic |
搜索忽略大小写 |
set hlsearch |
高亮搜索结果(似乎是默认) |
set nohlsearch |
取消高亮搜索结果 |
noh |
关闭高亮 |
set listchars=tab:>~,trail:. |
显示 TAB 键和行末空格 |
set cursorline |
当前行加上下划线 |
Key | Function |
---|---|
s/Gitee/Gitea/g |
将当前行所有 Gitee 替换成 Gitea |
%s/Gitee/Gitea/g |
将所有行所有 Gitee 替换成 Gitea |
%s/Gitee/Gitea/gi |
...忽略大小写 |
%s/Gitee/Gitea/gin |
...不真正执行,只反馈印象范围 |
5,10s/Gitee/Gitea/g |
将第 5 到 10 行所有 Gitee 替换成 Gitea |
.,+5s/Gitee/Gitea/g |
将当前行到后两行所有 Gitee 替换成 Gitea |
Key | Function |
---|---|
q |
退出(可能会提示你:已修改但尚未保存) |
w |
保存 |
wq |
保存并退出 |
x |
保存并退出 |
q! |
不保存,强行退出 |
:w !sudo tee % |
没有写入权限的时候提权保存 |
清空数据:gg
+ 1000dd
(跳到第一行,然后删除 1000 行)
> filepath
# 或
echo > filepath
apt search xxx
apt list
apt list --installed
apt list --upgradable
apt update
apt upgrade
apt-file list youtube-dl
apt-file search bin/update-locale
apt search
apt show
apt install
apt reinstall
apt remove
apt autoremove
apt full-upgrade
apt edit-sources
apt satisfy
apt-mark
apt-key
apt-config
apt-cache
apt-add-repository
比较独特的命令 [
/tmp
目录下的文件失败
项目中有一个下载日志文件的功能,大致流程是 WEB 后端调用底层方法收集并压缩一些 .log 文件生成一个 zip 压缩包,放在 /tmp 目录下,前端访问指定路径下载。
之前系统环境用的 CentOS 6.5,现在升级到了 CentOS 7,结果测试时发现下载文件下载失败。
awk 的文档写出来可能有一本很厚的书,里面甚至有一种内嵌的解释性编程语言在里面。但是我们普通人就把他当一个小工具,了解一下基础用法就好了,不用深入研究。它的基本功能是将字符串切割之后按照 $1
... $n
来处理,$0
表示整个字符串(整行)。
egrep
= grep -E
fgrep
= grep -F
# -G, --basic-regexp 基本正则, 默认
# -E, --extended-regexp 拓展正则
# -P, --perl-regexp Perl 正则
# -w 完全匹配字词
# -x 完全匹配整行
grep markjour /var/log/auth.log
grep -E markjour /var/log/auth.log
# -F, --fixed-strings
grep -F markjour /var/log/auth.log
tail -1000 /var/log/auth.log | grep -Ev 'gnome-keyring-daemon|CRON'
-r
目录-R
目录,处理软链-v
排除-i
忽略大小写 (ignore-case
)-m
控制匹配次数-a
包含二进制内容的文件当作纯文本处理-I
包含二进制内容的文件跳过
-b
输出命中内容的偏移量
-n
输出行号-o
仅输出匹配部分-h
不输出文件名(匹配多个文件时默认输出文件名 -H
)-L
, --files-without-match
仅输出没有匹配的文件名-l
, --files-with-matches
仅输出匹配文件名-c
, --count
仅输出文件名和匹配行数
--include=GLOB
只查找匹配 GLOB(文件模式)的文件
--exclude=GLOB
跳过匹配 GLOB 的文件--exclude-from=FILE
跳过所有匹配给定文件内容中任意模式的文件--exclude-dir=GLOB
跳过所有匹配 GLOB 的目录
-B
, --before-context=NUM
打印文本及其前面NUM 行
-A
, --after-context=NUM
打印文本及其后面NUM 行-C
, --context=NUM
打印NUM 行输出文本-NUM
等同于 --context=NUMdd if=/dev/zero of=cdata.img bs=1G count=5
mkfs ext4 -F cdata.img
LANG=en fdisk -lu cdata.img
sudo mount -o loop cdata.img /mnt/iso
sudo umount /mnt/iso
对内核资源进行分区,为进程隔离提供支持。
Namespace | CloneFlag | Version | Year |
---|---|---|---|
Mount (mnt) | CLONE_NEWNS | 2.4.19 | 2002 |
UTS | CLONE_NEWUTS | 2.6.19 | 2006 |
Inter-process Communication (ipc) | CLONE_NEWIPC | 2.6.19 | 2006 |
Process ID (pid) | CLONE_NEWPID | 2.6.24 | 2008 |
Network (net) | CLONE_NEWNET | 2.6.29 | 2009 |
User ID (user) | CLONE_NEWUSER | 3.8 | 2013 |
Control group (cgroup) | CLONE_NEWCGROUP | 4.6 | 2016 |
Time | CLONE_NEWTIME | 5.6 | 2020 |
挂载点可以在不同命名空间之间共享。
UNIX Time-Sharing
不知道为什么叫这个名字。作用是隔离主机名和域名。
不同 IPC 命名空间的进程不能通过 shm
系列方法共享内存。
每个网络命名空间都有一组自己的网络资源,包括 IP 地址、路由表、套接字列表、连接跟踪表、防火墙等等。
主要作用是权限的隔离。
进程控制组。
时间的隔离。
atime
:access time,访问时间mtime
:change time,修改时间,内容修改ctime
:modify time,变更时间,内容修改,或者元数据修改crtime
:create time / birth time,创建时间,部分文件系统支持(Ext4,btrfs,xfs)[root@localhost]# stat abc.txt
File: `abc.txt'
Size: 11214 Blocks: 24 IO Block: 4096 regular file
Device: fc10h/64528d Inode: 3153180 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2016-07-09 19:35:42.321279859 +0800
Modify: 2016-07-09 19:35:42.321279859 +0800
Change: 2016-07-09 19:35:42.321279859 +0800
[root@localhost]# cat abc.txt > /dev/null
[root@localhost]# stat abc.txt
File: `abc.txt'
Size: 11214 Blocks: 24 IO Block: 4096 regular file
Device: fc10h/64528d Inode: 3153180 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2016-07-09 19:35:42.321279859 +0800
Modify: 2016-07-09 19:35:42.321279859 +0800
Change: 2016-07-09 19:35:42.321279859 +0800
[root@localhost]# mount
/dev/vda1 on / type ext4 (rw,noatime,errors=remount-ro)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/vdb on /data type ext4 (rw,noatime)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
重点是 noatime 选项,表示文件系统忽略 atime 的变更,因为频繁的 atime 变更对性能有影响。