《快乐的Linux命令行》
第一部分:引言
本文为学习《快乐的Linux命令行》notes。 好羞耻的名字。。怎么说,这本书属于超级入门的那种,
所以简单快速的从头到尾浏览了一遍。不过收获还是有的,之前一些小东西可能也不清楚具体含义。
原文链接:http://billie66.github.io/TLCL/book/index.html
Date: 2018/07/25
第二部分:学习shell
2.1 文件系统中跳转
- ls -a 可以查看隐藏文件
- df:查看磁盘剩余空间的数量
- free:显示空闲内存的数量
2.2 探索操作系统
- ls
选项 | 长选项 | 描述 |
---|---|---|
-a | --all | 列出所有文件,甚至包括文件名以圆点开头的默认会被隐藏的隐藏文件。 |
-d | --directory | 通常,如果指定了目录名,ls 命令会列出这个目录中的内容,而不是目录本身。 把这个选项与 -l 选项结合使用,可以看到所指定目录的详细信息,而不是目录中的内容。 |
-F | --classify | 这个选项会在每个所列出的名字后面加上一个指示符。例如,如果名字是 目录名,则会加上一个'/'字符。 |
-h | --human-readable | 当以长格式列出时,以人们可读的格式,而不是以字节数来显示文件的大小。 |
-l | 以长格式显示结果。 | |
-r | --reverse | 以相反的顺序来显示结果。通常,ls 命令的输出结果按照字母升序排列。 |
-S | 命令输出结果按照文件大小来排序。 | |
-t | 按照修改时间来排序。 |
-
File: 确定文件类型
LORENYPLV-MB0:~ lorenyplv$ file software/ software/: directory
-
less 查看文件,q退出。G最后一行 g第一行 /charater查找字符 n下一个
目录 评论 / 根目录,万物起源。 /bin 包含系统启动和运行所必须的二进制程序。 /boot 包含 Linux 内核、初始 RAM 磁盘映像(用于启动时所需的驱动)和 启动加载程序。有趣的文件:/boot/grub/grub.conf or menu.lst, 被用来配置启动加载程序。/boot/vmlinuz,Linux 内核。 /dev 这是一个包含设备结点的特殊目录。“一切都是文件”,也适用于设备。 在这个目录里,内核维护着所有设备的列表。 /etc 这个目录包含所有系统层面的配置文件。它也包含一系列的 shell 脚本, 在系统启动时,这些脚本会开启每个系统服务。这个目录中的任何文件应该是可读的文本文件。有趣的文件:虽然/etc 目录中的任何文件都有趣,但这里只列出了一些我一直喜欢的文件:/etc/crontab, 定义自动运行的任务。/etc/fstab,包含存储设备的列表,以及与他们相关的挂载点。/etc/passwd,包含用户帐号列表。 /home 在通常的配置环境下,系统会在/home 下,给每个用户分配一个目录。普通用户只能 在自己的目录下写文件。这个限制保护系统免受错误的用户活动破坏。 /lib 包含核心系统程序所使用的共享库文件。这些文件与 Windows 中的动态链接库相似。 /lost+found 每个使用 Linux 文件系统的格式化分区或设备,例如 ext3文件系统, 都会有这个目录。当部分恢复一个损坏的文件系统时,会用到这个目录。这个目录应该是空的,除非文件系统 真正的损坏了。 /media 在现在的 Linux 系统中,/media 目录会包含可移动介质的挂载点, 例如 USB 驱动器,CD-ROMs 等等。这些介质连接到计算机之后,会自动地挂载到这个目录结点下。 /mnt 在早些的 Linux 系统中,/mnt 目录包含可移动介质的挂载点。 /opt 这个/opt 目录被用来安装“可选的”软件。这个主要用来存储可能 安装在系统中的商业软件产品。 /proc 这个/proc 目录很特殊。从存储在硬盘上的文件的意义上说,它不是真正的文件系统。 相反,它是一个由 Linux 内核维护的虚拟文件系统。它所包含的文件是内核的窥视孔。这些文件是可读的, 它们会告诉你内核是怎样监管计算机的。 /root root 帐户的家目录。 /sbin 这个目录包含“系统”二进制文件。它们是完成重大系统任务的程序,通常为超级用户保留。 /tmp 这个/tmp 目录,是用来存储由各种程序创建的临时文件的地方。一些配置导致系统每次 重新启动时,都会清空这个目录。 /usr 在 Linux 系统中,/usr 目录可能是最大的一个。它包含普通用户所需要的所有程序和文件。 /usr/bin /usr/bin 目录包含系统安装的可执行程序。通常,这个目录会包含许多程序。 /usr/lib 包含由/usr/bin 目录中的程序所用的共享库。 /usr/local 这个/usr/local 目录,是非系统发行版自带程序的安装目录。 通常,由源码编译的程序会安装在/usr/local/bin 目录下。新安装的 Linux 系统中会存在这个目录, 并且在管理员安装程序之前,这个目录是空的。 /usr/sbin 包含许多系统管理程序。 /usr/share /usr/share 目录包含许多由/usr/bin 目录中的程序使用的共享数据。 其中包括像默认的配置文件、图标、桌面背景、音频文件等等。 /usr/share/doc 大多数安装在系统中的软件包会包含一些文档。在/usr/share/doc 目录下, 我们可以找到按照软件包分类的文档。 /var 除了/tmp 和/home 目录之外,相对来说,目前我们看到的目录是静态的,这是说, 它们的内容不会改变。/var 目录存放的是动态文件。各种数据库,假脱机文件, 用户邮件等等,都位于在这里。 /var/log 这个/var/log 目录包含日志文件、各种系统活动的记录。这些文件非常重要,并且 应该时时监测它们。其中最重要的一个文件是/var/log/messages。注意,为了系统安全,在一些系统中, 你必须是超级用户才能查看这些日志文件。
符号链接
lrwxrwxrwx 1 root root 11 2007-08-11 07:34 libc.so.6 -> libc-2.6.so
个程序要求使用某个包含在名为“foo”文件中的共享资源,但是“foo”经常改变版本号。 这样,在文件名中包含版本号,会是一个好主意,因此管理员或者其它相关方,会知道安装了哪个“foo”版本。 这会导致另一个问题。如果我们更改了共享资源的名字,那么我们必须跟踪每个可能使用了 这个共享资源的程序,当每次这个资源的新版本被安装后,都要让使用了它的程序去寻找新的资源名。 这听起来很没趣。
比方说,我们安装了文件 “foo” 的 2.6 版本,它的 文件名是 “foo-2.6”,然后创建了叫做 “foo” 的符号链接,这个符号链接指向 “foo-2.6”。 这意味着,当一个程序打开文件 “foo” 时,它实际上是打开文件 “foo-2.6”。 现在,每个人都很高兴。依赖于 “foo” 文件的程序能找到这个文件,并且我们能知道安装了哪个文件版本。 当升级到 “foo-2.7” 版本的时候,仅添加这个文件到文件系统中,删除符号链接 “foo”, 创建一个指向新版本的符号链接。这不仅解决了版本升级问题,而且还允许在系统中保存两个不同的文件版本。 假想 “foo-2.7” 有个错误(该死的开发者!),那我们得回到原来的版本。 一样的操作,我们只需要删除指向新版本的符号链接,然后创建指向旧版本的符号链接就可以了。
2.3 操作文件和目录
cp
mv: 移动和重命名
mkdir
rm
-
ln
ln file link //创建软连接 ln -s item link //创建硬链接
通配符:http://billie66.github.io/TLCL/book/chap05.html
2.4 使用命令
[me@linuxbox ~]$ alias foo='cd /usr; ls; cd -' //创建别名
unalias foo //删除别名
2.5 重定向
cat
sort 排序文本行
uniq 报道或者省略重复行
grep 打印匹配行
wc 打印文件中换行符 字 字节个数
head
tail
tee 从标准输入读取数据,并同时写到标准输出和文件
I/O 重定向允许我们来重定义标准输出的地点。我们使用 “>” 重定向符后接文件名将标准输出重定向到除屏幕 以外的另一个文件。为什么我们要这样做呢?因为有时候把一个命令的运行结果存储到 一个文件很有用处。例如,我们可以告诉 shell 把 ls 命令的运行结果输送到文件 ls-output.txt 中去, 由文件代替屏幕。
[me@linuxbox ~]$ ls -l /usr/bin > ls-output.txt 标准输出重定向 每次会清空文件
[me@linuxbox ~]$ ls -l /usr/bin >> ls-output.txt 标准输出重定向 追加文件
[me@linuxbox ~]$ ls -l /bin/usr 2> ls-error.txt 文件描述符”2”,紧挨着放在重定向操作符之前,来执行重定向标准错误到文件 ls-error.txt 任务。
[me@linuxbox ~]$ ls -l /bin/usr > ls-output.txt 2>&1 标准输出和错误输出到同一个文件
[me@linuxbox ~]$ ls -l /bin/usr &> ls-output.txt //另一种写法 标准输出和错误输出到同一个文件
[me@linuxbox ~]$ cat < lazy_dog.txt //使用“<”重定向操作符,我们把标准输入源从键盘改到文件 lazy_dog.tx。我们看到结果 和传递单个文件名作为参数的执行结果一样。把这和传递一个文件名参数作比较,不是特别有意义, 但它是用来说明把一个文件作为标准输入源。有其他的命令更好地利用了标准输入,我们不久将会看到
管道线
命令从标准输入读取数据并输送到标准输出的能力被一个称为管道线的 shell 特性所利用。 使用管道操作符”|”(竖杠),一个命令的标准输出可以通过管道送至另一个命令的标准输入:
command1 | command2
[me@linuxbox ~]$ ls /bin /usr/bin | sort | uniq | less
[me@linuxbox ~]$ ls /bin /usr/bin | sort | uniq | wc -l //它接受标准输入。”-l”选项限制命令输出只能 报道行数。添加 wc 到管道线来统计数据,是个很便利的方法。查看我们的有序列表中程序个数
grep- 打印匹配行
[me@linuxbox ~]$ ls /bin /usr/bin | sort | uniq | grep zip
head / tail - 打印文件开头部分/结尾部分
[me@linuxbox ~]$ head -n 5 ls-output.txt
2.6 从shell眼中看世界
echo - 显示一行文本
[me@linuxbox ~]$ echo *
Desktop Documents ls-output.txt Music Pictures Public Templates Videos
那么刚才发生了什么事情呢? 为什么 echo 不打印”“呢?如果你回忆起我们所学过的 关于通配符的内容,这个”“字符意味着匹配文件名中的任意字符,但在原先的讨论 中我们并不知道 shell 是怎样实现这个功能的。简单的答案就是 shell 在 echo 命 令被执行前把”“展开成了另外的东西(在这里,就是在当前工作目录下的文件名字)。 当回车键被按下时,shell 在命令被执行前在命令行上自动展开任何符合条件的字符, 所以 echo 命令的实际参数并不是”“,而是它展开后的结果。知道了这个以后, 我们就能明白 echo 的行为符合预期。
[me@linuxbox ~]$ echo $((2 + 2))
4
[me@linuxbox ~]$ echo $(((5**2) * 3))
75
//格式如下
$((expression))
//花括号展开
[me@linuxbox ~]$ echo Front-{A,B,C}-Back
Front-A-Back Front-B-Back Front-C-Back
[me@linuxbox ~]$ echo {Z..A}
Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
[me@linuxbox ~]$ echo a{A{1,2},B{3,4}}b
aA1b aA2b aB3b aB4b
[me@linuxbox Pics]$ mkdir {2007..2009}-0{1..9} {2007..2009}-{10..12}
[me@linuxbox Pics]$ ls
2007-01 2007-07 2008-01 2008-07 2009-01 2009-07
2007-02 2007-08 2008-02 2008-08 2009-02 2009-08
2007-03 2007-09 2008-03 2008-09 2009-03 2009-09
2007-04 2007-10 2008-04 2008-10 2009-04 2009-10
2007-05 2007-11 2008-05 2008-11 2009-05 2009-11
2007-06 2007-12 2008-06 2008-12 2009-06 2009-12
2.7 键盘高级操作技巧
-.-!!!! 太优秀了,我先择死亡。
2.8 权限
涉及到的命令列表:
- id 显示用户身份号
- chmod 更改文件模式
- umask 设置默认的文件权限
- su 以另一个用户的身份来运行shell
- sudo 以另一个用户的身份来执行命令
- chown 更改文件所有者
- chgrp 更改文件组所有权
- passwd 更改用户密码
在 Unix 安全模型中,一个用户可能拥有文件和目录。当一个用户拥有一个文件或目录时, 用户对这个文件或目录的访问权限拥有控制权。用户反过来又属于一个由一个或多个 用户组成的用户组,用户组成员由文件和目录的所有者授予对文件和目录的访问权限。除了 对一个用户组授予权限之外,文件所有者可能会给每个人一些权限,在 Unix 术语中,每个人 是指整个世界。可以用 id 命令,来找到关于你自己身份的信息:
[me@linuxbox ~]$ id
uid=500(me) gid=500(me) groups=500(me)
文件读取、写入、执行
文件类型
属性 | 文件类型 |
---|---|
- | 一个普通文件 |
d | 一个目录 |
l | 一个符号链接。注意对于符号链接文件,剩余的文件属性总是"rwxrwxrwx",而且都是 虚拟值。真正的文件属性是指符号链接所指向的文件的属性。 |
c | 一个字符设备文件。这种文件类型是指按照字节流来处理数据的设备。 比如说终端机或者调制解调器 |
b | 一个块设备文件。这种文件类型是指按照数据块来处理数据的设备,例如一个硬盘或者 CD-ROM 盘。 |
chmod - 更改文件模式
更改文件或目录的模式(权限),可以利用 chmod 命令。注意只有文件的所有者或者超级用户才 能更改文件或目录的模式。chmod 命令支持两种不同的方法来改变文件模式:八进制数字表示法或 符号表示法。首先我们讨论一下八进制数字表示法。
Octal | Binary | File Mode |
---|---|---|
0 | 000 | --- |
1 | 001 | --x |
2 | 010 | -w- |
3 | 011 | -wx |
4 | 100 | r-- |
5 | 101 | r-x |
6 | 110 | rw- |
7 | 111 | rwx |
[me@linuxbox ~]$ chmod 600 foo.txt
[me@linuxbox ~]$ ls -l foo.txt
-rw------- 1 me me 0 2008-03-06 14:52 foo.txt
chmod 命令符号表示法
u | "user"的简写,意思是文件或目录的所有者。 |
---|---|
g | 用户组。 |
o | "others"的简写,意思是其他所有的人。 |
a | "all"的简写,是"u", "g"和“o”三者的联合。 |
如果没有指定字符,则假定使用”all”。执行的操作可能是一个“+”字符,表示加上一个权限, 一个“-”,表示删掉一个权限,或者是一个“=”,表示只有指定的权限可用,其它所有的权限被删除。
事例:
u+x | 为文件所有者添加可执行权限。 |
---|---|
u-x | 删除文件所有者的可执行权限。 |
+x | 为文件所有者,用户组,和其他所有人添加可执行权限。 等价于 a+x。 |
o-rw | 除了文件所有者和用户组,删除其他人的读权限和写权限。 |
go=rw | 给群组的主人和任意文件拥有者的人读写权限。如果群组的主人或全局之前已经有了执行的权限,他们将被移除。 |
u+x,go=rw | 给文件拥有者执行权限并给组和其他人读和执行的权限。多种设定可以用逗号分开。 |
2.9 进程
主要涉及的命令:
- ps 报告当前进程快照
- top 显示任务
- jobs 列出活跃的任务
- bg 把一个任务放到后台执行
- fg 把一个任务放到前台执行
- kill 给一个进程发送信号
- killall 杀死指定名字的进程
- shutdown 关机或者重启系统
查看进程
ps x //展现所有进程
进程状态:
状态 | 含义 |
---|---|
R | 运行中。这意味着,进程正在运行或准备运行。 |
S | 正在睡眠。进程没有运行,而是,正在等待一个事件, 比如说,一个按键或者网络分组。 |
D | 不可中断睡眠。进程正在等待 I/O,比方说,一个磁盘驱动器的 I/O。 |
T | 已停止. 已经指示进程停止运行。稍后介绍更多。 |
Z | 一个死进程或“僵尸”进程。这是一个已经终止的子进程,但是它的父进程还没有清空它。 (父进程没有把子进程从进程表中删除) |
< | 一个高优先级进程。这可能会授予一个进程更多重要的资源,给它更多的 CPU 时间。 进程的这种属性叫做 niceness。具有高优先级的进程据说是不好的(less nice), 因为它占用了比较多的 CPU 时间,这样就给其它进程留下很少时间。 |
N | 低优先级进程。 一个低优先级进程(一个“好”进程)只有当其它高优先级进程被服务了之后,才会得到处理器时间。 |
ps aux //展示更多的信息 这个选项组合,能够显示属于每个用户的进程信息。使用这个选项,可以唤醒 “BSD 风格” 的输出结果。 Linux 版本的 ps 命令,可以模拟几个不同 Unix 版本中的 ps 程序的行为。通过这些选项,我们得到 这些额外的列。
BSD风格的ps命令列标题
标题 | 含义 |
---|---|
USER | 用户 ID. 进程的所有者。 |
%CPU | 以百分比表示的 CPU 使用率 |
%MEM | 以百分比表示的内存使用率 |
VSZ | 虚拟内存大小 |
RSS | 进程占用的物理内存的大小,以千字节为单位。 |
START | 进程启动的时间。若它的值超过24小时,则用天表示。 |
用top命令动态查看进程
top 程序以进程活动顺序显示连续更新的系统进程列表。(默认情况下,每三秒钟更新一次),”top”这个名字 来源于 top 程序是用来查看系统中“顶端”进程的。top 显示结果由两部分组成: 最上面是系统概要,下面是进程列表,以 CPU 的使用率排序。
第三部分:配置文件和shell环境
3.1 shell环境
XXXXX
3.2 vi 简介
补拉下的功课,我的腰呀呀呀呀!!
请见:http://billie66.github.io/TLCL/book/chap13.html 太多了。只记住了最简单的。其他的用到再查吧/
按键 | 移动光标 |
---|---|
l or 右箭头 | 向右移动一个字符 |
h or 左箭头 | 向左移动一个字符 |
j or 下箭头 | 向下移动一行 |
k or 上箭头 | 向上移动一行 |
0 (零按键) | 移动到当前行的行首。 |
^ | 移动到当前行的第一个非空字符。!!! |
$ | 移动到当前行的末尾。!!! |
w | 移动到下一个单词或标点符号的开头。 |
W | 移动到下一个单词的开头,忽略标点符号。 |
b | 移动到上一个单词或标点符号的开头。 |
B | 移动到上一个单词的开头,忽略标点符号。 |
Ctrl-f or Page Down | 向下翻一页 |
Ctrl-b or Page Up | 向上翻一页 |
numberG | 移动到第 number 行。例如,1G 移动到文件的第一行。 |
G | 移动到文件末尾。!!! |
删除操作:
命令 | 删除的文本 |
---|---|
x | 当前字符 |
3x | 当前字符及其后的两个字符。 |
dd | 当前行。 |
5dd | 当前行及随后的四行文本。 |
dW | 从光标位置开始到下一个单词的开头。 |
d$ | 从光标位置开始到当前行的行尾。 |
d0 | 从光标位置开始到当前行的行首。 |
d^ | 从光标位置开始到文本行的第一个非空字符。 |
dG | 从当前行到文件的末尾。 |
d20G | 从当前行到文件的第20行。 |
剪切,复制和粘贴文本 d y p
这个 d 命令不仅删除文本,它还“剪切”文本。每次我们使用 d 命令,删除的部分被复制到一个 粘贴缓冲区中(看作剪切板)。过后我们执行小 p 命令把剪切板中的文本粘贴到光标位置之后, 或者是大 P 命令把文本粘贴到光标之前。
复制命令:
命令 | 复制的内容 |
---|---|
yy | 当前行。 |
5yy | 当前行及随后的四行文本。 |
yW | 从当前光标位置到下一个单词的开头。 |
y$ | 从当前光标位置到当前行的末尾。 |
y0 | 从当前光标位置到行首。 |
y^ | 从当前光标位置到文本行的第一个非空字符。 |
yG | 从当前行到文件末尾。 |
y20G | 从当前行到文件的第20行。 |
第四部分:常见任务和基本工具
4.1 软件包管理
在包管理系统中软件的基本单元是包文件。包文件是一个构成软件包的文件压缩集合。一个软件包 可能由大量程序以及支持这些程序的数据文件组成。除了安装文件之外,软件包文件也包括 关于这个包的元数据,如软件包及其内容的文本说明。另外,许多软件包还包括预安装和安装后脚本, 这些脚本用来在软件安装之前和之后执行配置任务。
Style | Command(s) |
---|---|
Debian | apt-get update; apt-get install package_name |
Red Hat | yum install package_name |
4.2 存储媒介
xxxx
4.3 网络系统
-
ping - 发送 ICMP ECHO_REQUEST 数据包到网络主机
- 最基本的网络命令是 ping。这个 ping 命令发送一个特殊的网络数据包,叫做 ICMP ECHO_REQUEST,到 一台指定的主机。大多数接收这个包的网络设备将会回复它,来允许网络连接验证。
-
traceroute - 打印到一台网络主机的路由数据包
-
这个 traceroute 程序(一些系统使用相似的 tracepath 程序来代替)会显示从本地到指定主机 要经过的所有“跳数”的网络流量列表。例如,看一下到达 slashdot.org 需要经过的路由, 我们将这样做: [me@linuxbox ~]$ traceroute slashdot.org
traceroute to slashdot.org (216.34.181.45), 30 hops max, 40 byte packets 1 ipcop.localdomain (192.168.1.1) 1.066 ms 1.366 ms 1.720 ms 2 * * * 3 ge-4-13-ur01.rockville.md.bad.comcast.net (68.87.130.9) 14.622 ms 14.885 ms 15.169 ms 4 po-30-ur02.rockville.md.bad.comcast.net (68.87.129.154) 17.634 ms 17.626 ms 17.899 ms 5 po-60-ur03.rockville.md.bad.comcast.net (68.87.129.158) 15.992 ms 15.983 ms 16.256 ms 6 po-30-ar01.howardcounty.md.bad.comcast.net (68.87.136.5) 22.835 ...
-
-
netstat - 打印网络连接,路由表,接口统计数据,伪装连接,和多路广播成员
- netstat 程序被用来检查各种各样的网络设置和统计数据。通过此命令的许多选项,我们 可以看看网络设置中的各种特性。使用“-ie”选项,我们能够查看系统中的网络接口
ftp - 因特网文件传输程序
wget - 非交互式网络下载器
ssh - OpenSSH SSH 客户端(远程登录程序)
4.4 查找文件
locate – 通过名字来查找文件
find – 在一个目录层次结构中搜索文件
-
xargs – 从标准输入生成和执行命令行
-
这个 xargs 命令会执行一个有趣的函数。它从标准输入接受输入,并把输入转换为一个特定命令的 参数列表。对于我们的例子,我们可以这样使用它:
find ~ -type f -name 'foo*' -print | xargs ls -l -rwxr-xr-x 1 me me 224 2007-10-29 18:44 /home/me/bin/foo -rw-r--r-- 1 me me 0 2008-09-19 12:53 /home/me/foo.txt
-
touch – 更改文件时间
stat – 显示文件或文件系统状态