Fork me on GitHub

《Linux命令行大全》读书笔记

第一章 什么是shell

shell就是一个程序,它接受从键盘输入的命令,然后把命令传递给操作系统执行。当使用图像用户界面时,我们需要一个叫做终端仿真器的程序和shell作交互。超级用户的提示符是$,普通用户的提示符为#.

一些简单的命令

  • date:显示系统当前的日期和时间
  • cal:显示当前月份的日历
  • df: 查看磁盘剩余空间的数量
  • free:显示内存空闲的数量
  • exit: 结束终端会话

第二章 文件系统中跳转

显示当前工作目录

pwd

列出目录内容

ls

更改当前工作目录

cd

相对路径

  • .: 工作目录
  • ..: 工作目录的父目录
  • ~: 家目录

第三章 研究操作系统

ls命令选项和参数

选项 长选项 描述
-a –all 列出所有文件包括隐藏文件
-h –human-readable 以人们可读的格式列出
-l 以长格式显示结果
-r –reverse 以相反的顺序显示结果
-S 按文件大小来排序
-t 按修改时间来排序

深入研究长格式

-rw-r–r– 1 ma staff 4579 2 3 10:09 debug.log

字段 含义
-rw-r–r– 文件的访问权限。第一个字符指明文件类型,‘-’是一个普通文件,‘d’是一个目录。后面三个是所有者的权限,再三个是群组成员的权限,后三个是其它人的权限。
1 文件的硬链接数目
Ma 文件所属的用户名
staff 文件所属的群组名
4579 以字节数表示的文件大小
—- 上次修改的文件日期
*** 文件名

确定文件类型

file filename

用less浏览文件内容

Less filename

less常用的键盘命令:

命令 行为
page up or b 向上翻页
page down or space 向下翻页
G 移动到最后一个行
1G or g 移动到开头一行
/characters 向前查找指定的字符串
n 向下查找下一个出现的字符
h 显示帮助
q 退出less

第四章 操作文件和目录

通配符

通配符 意义
* 匹配任意多个字符,包括0个和1个
匹配任意一个字符
[characters] 匹配任意一个属于字符集中的字符
[!characters] 匹配任意一个非字符集中的字符
[[:class:]] 匹配任意一个指定类中的字符

常用的字符类:
| 字符符 | 意义 |
| ———————- | —————————— |
| [:alnum:] | 匹配任意一个字母或数字 |
| [:alpha:] | 匹配任意一个字母 |
| [:digit:] | 匹配任意一个数字 |
| [:upper:]或者[:lower:] | 匹配任意一个大写或者小写字母 |

mkdir创建目录

mkdir dir1 dir2

创建目录dir1和dir2

cp 复制文件和目录

cp item1 item2

cp item1… directory

一些有用的选项

选项 意义
-a, –archive 复制文件和目录,以及他们的属性
-i, –interactive -i, –interactive
-r, –recursive 递归地复制目录和文件,复制目录时,需要这个选项
-u, –update 仅复制目标目录中不存在的文件

mv 移动和重命名文件

mv item1 item2

一些选项

选项 意义
-i, –interactive -i, –interactive
-u, –update 仅复制目标目录中不存在的文件

rm 删除文件和目录

rm选项和意义:

选项 意义
-i,–interactive 删除前提示用户
-r,–recursive 递归地删除文件,若删除目录则需指定这个选项
-f,–force 忽视不存在的文件,不显示提示信息
-v,–verbose 执行命令时,显示详实的信息

Linux系统没有复原命令,一旦用rm删除一些东西,就永远消失了,所以无论啥时候,rm命令用到通配符的时候,先用ls测试通配符。

第五章 使用命令

命令是什么

命令可以是下列4种形式之一:

  1. 是一个可执行程序
  2. 是一个内建于shell自身的命令
  3. 是一个shell函数
  4. 是一个命令别名

显示命令的类型

type是shell的内部命令,它会显示命令的类别,给出一个特定的命令名。

显示一个可执行程序的位置

使用which命令可以确定所给定的执行程序的准确位置。

得到shell内部命令的帮助文档

使用help command命令得到命令的帮助文档;许多可执行程序支持--help选项,显示此命令支持的语法和选项说明。

man 显示程序手册页

whatis 显示非常简洁的命令说明

info 显示程序的Info条目

创建别名

使用alias命令创建命令的别名,使用方法

alias name=’string’

注意:name与string之间没有空格。string是一系列的命令,name是这一系列命令的别名,下次输入name时等价于输入string。

使用unalias命令删除别名。

第六章 重定向

标准输入输出

一般地,输出送到屏幕,输入来自键盘,但是通过I/O重定向我们可以改变输入输出的方向。

重定向标准输出

使用>重定向符,后面跟着文件名,则会把原本输出到标准输出的内容输出到重定向符后面的文件中。需要注意的是使用>重定向符重定向输出结果时,目标文件总是从头开始被重写。所以当我们需要删除一个文件内容或者新建一个空文件的时候,可以使用这样一个技巧:

> filename

使用>>重定向符可以把重定向结果追加到文件内容后面,而不是重头开始写文件,如果文件不存在,文件会被新建。

>> filename

重定向标准错误

文件描述符0,1,2分别表示标准输入、输出和错误。

ls -l /bin/usr 2> ls-error.txt

文件描述符’2‘紧挨着放在重定向符之前,执行重定向标准错误到文件ls-error.txt任务。

重定向标准输出和错误到同一个文件

第一种方法:

ls -l /bin/usr > ls-output.txt 2>&1

这里使用了两次重定向,首先重定向标准输出到文件ls-output.txt,然后重定向文件描述符2到文件描述符1,使用表示法2>&1.

第二种方法:

ls -l /bin/usr &> ls-output.txt

处理不需要的输出

ls -l /bin/usr 2> /dev/null

重定向标准输入

cat 连接文件

cat命令读取一个或多个文件,然后复制他们到标准输出,cat经常用来显示简短的文本文件。

cat [file]

cat可以将多个文件连接成或者合并为一个文件:

cat file1 … filem > cat_file

管道线

管道线操作符|可以使一个命令的标准输出作为另一个命令的标准输入:

command1 | command2

过滤器

  • sort,排序
  • uniq,忽略重复行
  • wc,打印行,字和字节数
  • grep,打印匹配行
  • head/tail,打印文件开头、结尾部分

第七章 从shell眼中看世界

字符展开

算术表达式展开

花括号展开

通过它可以从一个包含花括号的模式中创建多个字符串。

ma$ echo F-{a,b,c}-B

F-a-B F-b-B F-c-B

ma$ echo {1..10}

1 2 3 4 5 6 7 8 9 10

echo {A..Z}

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

参数展开

其实就是shell中的变量。

命令替换

ma\$ ls -l ​\$(which cd)

-rwxr-xr-x 15 root wheel 190 8 18 08:20 /usr/bin/cd

which cd会返回一个路径。

双引号

双引号中的文本被当做普通字符看待,但是参数展开和算术表达式展开仍然有效。

单引号

所有的展开将被禁止。

转义字符

转移序列 含义
\a 响铃
\b 退格键
\n 换行
\r 回车符
\t 制表符

第八章 键盘高级技巧

移动光标

按键 行动
Ctrl-a 移动光标到行首
Ctrl-e 行尾
Ctrl-f 右键头
Ctrl-b 左箭头
Alt-f 光标前移一个字
Alt-b 光标后移一个字
Ctrl-l 清空屏幕,同clear命令相同

修改文本

按键 行动
Ctrl-d 删除光标位置的字符
Ctrl-t 光标位置的字符和光标前面的字符互换位置
Alt-t 光标位置的字和前面的字互换位置
Alt-l 把光标位置到字尾的字符换成小写字母
Alt-u 把光标位置到字尾的字符换成大写字母

剪切和粘贴

按键 行动
Ctrl-k 剪切光标位置到行尾的文本
Ctrl-u 剪切光标位置到行首的文本
Alt-d 剪切光标位置到词尾的文本
Alt-backspace 剪切光标位置到词头的文本
Ctrl-y 把剪切板的内容粘贴到光标位置

历史命令

history显示历史命令。

可以通过

history | less

来浏览历史命令。通过执行

history | grep 目录

来找到此目录中的命令。通过

!行号

来执行历史命令中此行号对应的命令。

第九章 权限

创建一个文件并显示它的详细信息

$ > foo.txt

$ ls -l foo.txt

-rw-r–r– 1 ma staff 0 2 16 19:46 foo.txt

显示的前十个字符是文件的属性,第一个字符表示文件的类型。下表是文件常见的类型:

属性 文件类型
- 普通文件
d 目录
l 符号链接
c 字符设备文件
b 快设备文件

剩下的九个字符代表文件所有者、文件组所有者、其他人的读写和执行权限。

chmod 更改文件模式

可以使用两种方法改变文件模式:八进制数字表示法和符号表示法。

数字表示法

因为对所有者、群组和其他人分别有r、w、x三种权限,所以假如对于所有者的权限来讲,所有者对文件有r权限和w权限,但是x权限没有,那么他有的权限的位置就置为1,反之为0,那么对应地二进制表示为110,与此对应的八进制为6,即所有者的权限用一个4表示,其它群组和其他人时同理,所以一个文件可以用3个八进制数字表示它的权限模式。例如改变foo.txt的文件权限:

$ chmod 600 foo.txt

$ ls -l foo.txt

-rw——- 1 ma staff 0 2 16 19:46 foo.txt

符号表示法

符号表示法分为3个部分:更改会影响谁,要执行那个操作,要设置哪种权限。

符号 含义
u 文件所有者
g 用户组
o 其他人
a u、g、o三者的组合

若没有指定字符,则假定使用a。

执行的操作有两种:+增加一个权限,-删掉一个权限。

权限用r、w、x指定。例如

$ chmod g+r foo.txt

$ ls -l foo.txt

-rw-r—– 1 ma staff 0 2 16 19:46 foo.txt

更改身份

su 以其他用户和组ID运行一个shell

su命令以另一个用户的身份来启动shell:

su [-[l]] [user]

如果包含-l选项,那么会为指定用户启动一个需要登录的shell,意味着会加载这个用户的shell环境,并且工作目录会更改到这个用户的家目录。如果不指定用户,则默认启动超级用户。-l可以缩写为-,例如启动超级用户:

su -

当工作完成后,输入exit返回原来的shell。也可以只执行单个命令,而不是启动一个新的可交互的shell,

su -c ‘command’

命令用单引号括起来。

sudo 以另一个用户身份执行命令

sudo很多方面类似于su,但sudo还有其他一些总要的功能。管理员可以配置sudo命令,从而使用户以不同身份通过一种可控的方式来执行命令。sudo命令不要求超级用户的密码,而是需要自己的密码来认证。sudo命令不会重新启动一个shell,命令不必用单引号括起来。

chown 更改文件所有者和用户组

使用这个命令需要超级用户权限。命令语法:

chown [owner][:[grou]] file…

更改用户密码

只要输入passwd命令,就能更改你的密码。

References

  1. William E.Shotts,Linux命令行大全