目录

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 下的,如有侵权请留言,我尽快处理。

bash快捷键.jpg

  • 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 键进行翻行。
    EnterPagedown,向下/上翻页。
  • 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_LANGUAGETLDR_CACHE_ENABLED

#linux
export TLDR_LANGUAGE="zh"
export TLDR_CACHE_ENABLED=1

#windows
$env:TLDR_LANGUAGE="zh"
$env:TLDR_CACHE_ENABLED=1

tlrd 使用中文 | X-Ray

这里仅仅演示下结果,想自动加载环境变量可以写到 $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

参考资料

最近更新:

发布时间:

摆哈儿龙门阵