Linux - Shell 特性与 man 文档
目录
shell 特性
命令历史
Linux 会自动记录系统过去执行的命令,并保存在内存的缓冲区中(内存数据在重启后会消失)。
在每个用户的 home 目录下,有个隐藏文件 .bash_history 保存当前 Shell 执行的命令历史,当用户正常退出当前 Shell 时,当前 shell 中运行的命令才会保存到此文件中。
这个文件你可以直接读取,也可使用 history 查看执行过后的 Linux 命令历史。
[root@VM-24-2-centos ~]# history | tail -n 30
1 2022-04-13 13:31:08 ls
2 2022-04-13 13:36:02 cd ..ls
3 2022-04-13 13:31:04 tmux a
4 2022-04-13 13:36:06 ls
5 2022-04-13 21:50:44 mysql -u root -p
6 2022-04-13 21:53:45 mysql -u root -p
7 2022-04-13 21:54:24 mysql -u root -p
8 2022-04-13 21:54:28 mysql -u root -p
9 2022-04-13 21:56:09 mysql -u root -p
10 2022-04-25 18:06:12 vim 1.php
11 2022-04-25 18:07:50 php 1.php
history -w 可以将命令历史保存在某个文件中,方便后续查看。
[root@VM-24-2-centos test]# history -w history_commend.txt
[root@VM-24-2-centos test]# ll -h
total 52K
-rw------- 1 root root 49K May 19 22:44 history_commend.txt
要是想清空历史命令你可以直接删文件,也能用 history -c 清空。
[root@VM-24-2-centos test]# history
1 history
2 tests
3 test
4 history
[root@VM-24-2-centos test]# history -c
[root@VM-24-2-centos test]# history
1 history
history -d 选项可以删除某一条命令历史,-d 参数是从删除第几条。
[root@VM-24-2-centos test]# test
[root@VM-24-2-centos test]# test 1
[root@VM-24-2-centos test]# history
1 test
2 test 1
3 history
[root@VM-24-2-centos test]# history -d 2
[root@VM-24-2-centos test]# history
1 test
2 history
3 history -d 2
4 history
到底能够存多少命令?这取决于 HISTSIZE 命令历史大小变量的数值,默认值是 1000 条。
[root@VM-24-2-centos test]# echo $HISTSIZE
1000
重定向
冯诺依曼体系结构:
- 运算器(是 CPU 的功能用于读取系统指令)
- 运算器(CPU 进行)
- 存储器(RAM 内部存储器,易失性存储器)
- 输入设备(Input,用于输入数据比如:键盘、硬盘等)
- 输出设备(Output,用于输出指令执行结果比如:显示器、音箱和硬盘等)
计算机总线:
- 地址总线(负责内存寻址)
- 数据总线(负责传输数据)
- 控制总线(负责控制指令)
寄存器(CPU 中内部临时存储空间)
I/O 设备(负责计算机内部存储和外部存储设备进行交互的设备)
程序:指令+数据;那指令是什么?指令是由程序提供,用来加工数据。数据来自可以来自变量、文件、输入设备等。要是没有指定数据来源时会指定到标准输入/输出设备。
标准输入(stdin)设备有:键盘,文件描述符为 0,标准输出(stdout)设备有:显示器,文件描述符为 1,标准错误输出(stderr)设备:显示器,文件描述符为 2。
三种数据流:标准输入数据流、标准输出数据、流标准错误输出数据流。
当在 Linux 中打开一个文件时,内核会反复调用一些输入或出设备,对于文件标识就很重要了,用文件描述符来标识文件,文件加载完成用数字表示(fd:file descriptor文件描述符)。
IO 重定向:是当用户没有为指令指定数据来源时,系统要有一个默认来源,有可能是输入或输出设备。重定向是把默认的输入或输出的数据来源,重新定向到其他的文件或设备。
输出重定向:
>
,覆盖输出重定向,也等同于1>
。>>
,追加输出重定向。2>
,错误覆盖输出重定向。2>>
,错误追加输出重定向。&>
,混合覆盖输出重定向,即正确、错误都混在一起输出。&>>
,混合追加输出重定向。
输入重定向:
<
,输入重定向,等同于0<
。
重定向补充
标准输出和标准错误输出默认都输出到屏幕。
先将标准输出到 file 文件最后再把错误输出到标准输出,这里的标准输出就是前面 file 文件。
[test@centos7 ~]$ find /home -iname .bashrc > file 2>&1 #将标准错误输出重定向到标准输出
这里的变换等同于上一条。
[test@centos7 ~]$ find /home -iname .bashrc > file 1>&2 #将标准输出重定向到错误
-
符号意义用于当做 stdout 或 stdin。下面命令 tar -cvf -
减号的位置是当做标准输出,结果会输出到屏幕上 ./saa是输入
。
[root@centos7 home]# tar cvf - ./saa
./saa
./saa0000644000000000000000000000371013452642177010414 0ustar rootrootabrt
adjtime
管道
管道是用 |
连接多条命令,把前一条命令的输出结果作为后一条命令的输入条件。
ls 显示 / 目录下的所有文件与文件夹,并把它传给 tr 转换成大写字母。
ls / | tr [a-z] [A-Z]
这条命令会把显示 / 目录下的文件与文件夹,并用管道把它传给 tee 命令(tee 它与输出重定向相似,会把文件输出到屏幕上并写入到文件中)进行使用,tee 将 ls 穿过来的内容进行屏幕显示并写入到 show.out 文件。
ls / | tee show.out
命令别名
命令别名就是把一个一个取个外号,以后调用这个外号等同于调用原有命令。
注意,执行 alias 命令时,COMMAND最好用 ''
引号引起来,只执行 alias 命令,会列出系统中所有的命令别名。
alias COMM_ALIAS=COMMAND
取消命令别名。
unalias COMM_ALIAS #
命令行编辑
学会一些快捷键会提高在命令行中的效率,别指望一次性全部记住,当你想到要用的时候回来看看,照着敲,次数多了自然就记住了。
这张图忘了从那个 blog 下的,如有侵权请留言,我尽快处理。
Ctrl + _
,撤销刚刚输入的内容。Ctrl + p
,返回上一个执行过的命令。对应键盘 ↑。Ctrl + n
,返回一下个命令。对应键盘 ↓。Ctrl + a
,从光标位置快速跳到行首。Ctrl + e
,从光标位置快速跳到行尾。Alt + f
,从光标处往后跳一个单词Alt + b
,从光标处往前跳一个单词Ctrl + f
,从光标处往后跳一个字符Ctrl + b
,从光标处往前跳一个字符Ctrl + u
,删除光标前所有字符。Ctrl + k
,删除光标后所有字符。Ctrl + h
,删除光标前一个字符。Ctrl + d
,1.删除光标后一个字符。2.在终端没有字符的情况下退出当前终端(exit 也可以)。Ctrl + w
,删除光标前的单词。Alt + d
,删除光标后的单词。Ctrl + l
,命令全部占满屏幕看的不舒服,清屏(等同于 clear 命令)。Ctrl + i
,用来补全和敲两个 tab 作用一致。Ctrl + j
,用来执行命令和敲 enter 一致。Ctrl + y
,粘贴剪切板内容。Ctrl + c
,终止当前命令。Ctrl + z
,暂停当前进程,可以用fg恢复进程。Ctrl + Shift + C
,复制。Ctrl + Shift + V
,粘贴。Ctrl + r
,根据你输入的关键词搜索历史命令,搜索不满意可以再次输入关键词继续使用 Ctrl + r 来搜索。不过不能上下翻页这一点算是遗憾。Ctrl + g
/Ctrl + c
,退出搜索Shift + PageUp
/Shift + PageDown
,可以在 Shell 中翻页查看已经执行过的命令(在图形化 Shell 窗口可以代替鼠标滑轮呀,纯 CLI Shell 你可没法用鼠标 hhh)!!
,执行上一条历史命令。!n
,执行命令历史第 n 条命令(n 是命令历史编号)。!-n
,执行命令历史中的倒数第 n 条命令(n 是命令历史编号)!word
,执行命令历史中最近一次以 word 开头的命令(word 必须能够唯一的标识用户想执行的命令)!?word
,之星命令历史中包含 word 的命令。!$
,行上一条执行过的命令的参数,最好使用Alt + .
、Esc + .
显示把参数调出来,看清楚再执行。
命令行展开
命令补齐原理是在 PATH 变量搜索命令并补齐,这需要 PATH 变量必须正常,输入要补齐的字符数一定能够唯一标识这条命令;tab 键补齐。
echo $PATH //查看PATH变量的值
按 tab 键两次,列出以某个字符开始所有的命令。
命令行补齐功能不能补齐选项。
路径和文件补齐:在系统路径中查找。
命令行通配(Wildcard)
*
,匹配任意长度的任意字符。?
,匹配任意单个字符。[]
,匹配指定范围内的任意单个字符。[a-z]
、[A-Z]
、[0-9]
、[a-zA-Z]
、[a-zA-Z0-9]
,匹配会包含开始字母与结束字母。[^]
,匹配指定范围外的任意单个字符。[^a-z]
、[^A-Z]
,与上面相反,不匹配中括号内的字符。[:space:]
,表示空格,在使用时要加上[]
,列如[[:space:]]
。[:punct:]
,表示所有标点符号。[:lower:]
,表示所有小写字母。[:upper:]
,表示所有大写字母。[:alpha:]
,表示所有字母,包括大小写。[:digit:]
,表示所有数字。[:alnum:]
,表示所有数字和大小写字母。
man 文档的使用
获取 Linux 命令的帮助信息最常用的是下面两种方式。
内部命令使用 help [command]
,外部命令使用 [command] --help
,另一个是用 man
,前者是简要信息,后者更为详细。
man 所有手册存放在 /usr/share/doc 目录。
进到内页后的一些操作:
↑
、↓
或 Enter 键进行翻行。Enter
、Pagedown
,向下/上翻页。Pageup
,向下翻页。/word
,从上往下查找关键字,找到关键字后可以用 n 再次向下查找,N 反之。?word
,从下往上查找关键字。q
,退出当前帮助信息。
既然是手册,当然会有不同的篇章,下面是介绍。
1 Executable programs or shell commands :可执行程序或 shell 命令,普通用户命令 (/bin /usr/bin /usr/local/bin):binary 二进制
2 System calls (functions provided by the kernel) :系统调用库。
3 Library calls (functions within program libraries) :程序库调用。
4 Special files (usually found in /dev) :设备或特殊文件(硬件设备 放在 /dev)。
5 File formats and conventions eg /etc/passwd 查看配置文件格式
6 Games :游戏。不知道为什么还存在这种东西。
7 Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7): 杂项
8 System administration commands (usually only for root) :系统管理员命令(/sbin /usr/sbin /usr/local/sbin)。
9 Kernel routines [Non standard]
以上 section 标题眼熟就好,在实际使用过程中是 man sectionNumber command
这样来找到对应内容,当然也不是每个 section number 都记得很清楚,可以使用 man -a command
来找到所有篇章内容,这样就方便不少。
man 内容相关标题说明:
NAME #命令名称及简要用法
SYNOPSIS #语法格式,可能包括一些选项的使用
DESCRIPTION #命令和命令选项的详细说明
Exit status #退出状态码
AUTHOR #作者信息
REPORTING BUGS(BUG) #发现bug时如何反馈信息
COPYRIGHT #该命令的版权信息
SEE ALSO #另外参照的帮助信息
OPTIONS #说明该命令每一个选项的详细用法
EXAMPLES #命令使用实例
一般看 man 手册都是查命令的详细使用方法,下面是 SYNOPSIS 相关说明:
<>
,必须使用的选项或参数,不可省略。[]
,可以省略的选项或参数。...
,可以使用多个选项或参数。|
,或,表示在多个[选项1|选项2|选项3]
中必须选择一个。{}
,表示分组,或是一个范围,这个范围内必须选择一个。
info
在线(不是联网)查看帮助,注重命令历史,版权信息等。
whatis
查看命令所在的帮助信息目录,该命令在系统启动大约 70m 后会生成 whatis 数据库,如果时间太短,该命令不会执行,我们可以使用 makewhatis 初始化该命令——7.0 中使用 mandb 来更新数据库,6.0 版本使用 makewhatis 更新数据库。
不再推荐使用 man
为什么?当你熟悉一些命令后,其实就只想知道某个命令的快速用法,但 man 手册中过于冗长,找起来很不方便。tldr 就解决了这个问题,来看看怎么用。
安装。官方提供的方式很多,可以查看 How do I use it? 小节根据自己平台已有的工具安装。由于 Linux 自带了 Python 下面示例就用 pip 做安装演示。
[root@blog ~]# python3 -m php3 install tldr
/usr/bin/python3: No module named php3
[root@blog ~]# python3 -m php install tldr
/usr/bin/python3: No module named php
[root@blog ~]# php3 install tldr
-bash: php3: command not found
[root@blog ~]# python3 -m pip install tldr
Looking in indexes: http://mirrors.tencentyun.com/pypi/simple
Collecting tldr
Downloading http://mirrors.tencentyun.com/pypi/packages/bb/bb/16befc247389b3b134c58511de2370784a9fced7873177d468325a4fe877/tldr-3.2.0-py3-none-any.whl (11 kB)
Requirement already satisfied: termcolor in /usr/local/lib/python3.6/site-packages (from tldr) (1.1.0)
Requirement already satisfied: colorama in ./.local/lib/python3.6/site-packages (from tldr) (0.4.5)
Collecting shtab>=1.3.10
Downloading http://mirrors.tencentyun.com/pypi/packages/87/e5/dd5e65376658c1e5462cad6eb3ef317b568cae07f6e1e06a1bf27f38145b/shtab-1.5.7-py2.py3-none-any.whl (13 kB)
Installing collected packages: shtab, tldr
Successfully installed shtab-1.5.7 tldr-3.2.0
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
查询某个命令用法。这里都是显示英文,其实也可以设置终端,但是比较鸡肋,建议看英文就好,短句不会太难。
[root@blog ~]# tldr ls
ls
List directory contents.
More information: https://www.gnu.org/software/coreutils/ls.
- List files one per line:
ls -1
- List all files, including hidden files:
ls -a
- List all files, with trailing `/` added to directory names:
ls -F
- Long format list (permissions, ownership, size, and modification date) of all files:
ls -la
- Long format list with size displayed using human-readable units (KiB, MiB, GiB):
ls -lh
- Long format list sorted by size (descending) recursively:
ls -lSR
- Long format list of all files, sorted by modification date (oldest first):
ls -ltr
- Only list directories:
ls -d */
工具提供了指定语言的参数,执行,网络超时,可能是需要梯子才行。
[root@blog ~]# tldr --language zh
Traceback (most recent call last):
File "/usr/local/bin/tldr", line 8, in <module>
sys.exit(cli())
File "/usr/local/lib/python3.6/site-packages/tldr.py", line 576, in cli
main()
File "/usr/local/lib/python3.6/site-packages/tldr.py", line 560, in main
options.language
File "/usr/local/lib/python3.6/site-packages/tldr.py", line 264, in get_page
return get_page_for_platform(command, platform, remote, language)
File "/usr/local/lib/python3.6/site-packages/tldr.py", line 164, in get_page_for_platform
context=URLOPEN_CONTEXT
File "/usr/lib64/python3.6/urllib/request.py", line 223, in urlopen
return opener.open(url, data, timeout)
File "/usr/lib64/python3.6/urllib/request.py", line 526, in open
response = self._open(req, data)
File "/usr/lib64/python3.6/urllib/request.py", line 544, in _open
'_open', req)
File "/usr/lib64/python3.6/urllib/request.py", line 504, in _call_chain
result = func(*args)
File "/usr/lib64/python3.6/urllib/request.py", line 1392, in https_open
context=self._context, check_hostname=self._check_hostname)
File "/usr/lib64/python3.6/urllib/request.py", line 1352, in do_open
r = h.getresponse()
File "/usr/lib64/python3.6/http/client.py", line 1361, in getresponse
response.begin()
File "/usr/lib64/python3.6/http/client.py", line 311, in begin
version, status, reason = self._read_status()
File "/usr/lib64/python3.6/http/client.py", line 272, in _read_status
line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
File "/usr/lib64/python3.6/socket.py", line 586, in readinto
return self._sock.recv_into(b)
File "/usr/lib64/python3.6/ssl.py", line 971, in recv_into
return self.read(nbytes, buffer)
File "/usr/lib64/python3.6/ssl.py", line 833, in read
return self._sslobj.read(len, buffer)
File "/usr/lib64/python3.6/ssl.py", line 590, in read
v = self._sslobj.read(len, buffer)
socket.timeout: The read operation timed out
最后用 Tianyu Li 的博客中分享的解决方法搞定了。
使用 pip3 安装客户端,因为 node 的不支持语言命令行。
用 --language 命令设置也没找到正确的参数(垃圾文档),只能用环境变量。
设置环境变量
TLDR_LANGUAGE
和TLDR_CACHE_ENABLED
#linux export TLDR_LANGUAGE="zh" export TLDR_CACHE_ENABLED=1 #windows $env:TLDR_LANGUAGE="zh" $env:TLDR_CACHE_ENABLED=1
这里仅仅演示下结果,想自动加载环境变量可以写到 $HOME 下用户的配置文件。
[root@blog ~]# export TLDR_LANGUAGE="zh"
[root@blog ~]# export TLDR_CACHE_ENABLED=1
[root@blog ~]# tldr ls
ls
列出目录中的内容。
更多信息:https://www.gnu.org/software/coreutils/ls.
- 列出目录中的文件,每个文件占一行:
ls -1
- 列出包含隐藏文件的所有文件:
ls -a
- 列出所有文件,如果是目录,则在目录名后面加上「/」:
ls -F
- 列出包含隐藏文件的所有文件信息,包括权限,所有者,大小和修改日期:
ls -la
- 列出所有文件信息,大小用人类可读的单位表示(KiB, MiB, GiB):
ls -lh
- 列出所有文件信息,按大小降序排序:
ls -lS
- 列出所有文件信息,按修改日期从旧到新排序:
ls -ltr
- 只列出目录:
ls -d */
其实大家也要注意,对于还没翻译的命令依旧会显示出原文,具体翻译进度从 https://lukwebsforge.github.io/tldri18n 可以勾选 zh 与 en 进行比对。
[root@blog ~]# tldr bully
bully
Brute-force the WPS pin of a wireless access point.
Necessary information must be gathered with `airmon-ng` and `airodump-ng` before using `bully`.
More information: https://salsa.debian.org/pkg-security-team/bully.
- Crack the password:
bully --bssid "mac" --channel "channel" --bruteforce "interface"
- Display help:
bully --help
更新。如果有些命令查不到很可能是人家刚更新,但你安装完工具数据没同步到本地,我们用 -u 选项进行更新。要还是找不到说明人家这个例子还没写。我们能做的是尝试更新,找不到再去其他站点搜搜用法。
[root@blog ~]# tldr -u
Updated cache for 4883 entries
参考资料
最近更新:
发布时间: