系统学习 Linux
命令可以参考这本书:《The Linux Command Line》。
学习 Shell
- 如果提示符的最后一个字符是“#”, 而不是“$”, 那么这个终端会话就有超级用户权限。
- 如果是仿终端鼠标选中或者双击选中默认拷贝到缓冲区,按下鼠标中键可以粘贴。
ls
命令选项:-F
如果是目录后面会加/
;-h
大小已可读的形式显示;-S
大小排序,-t
修改时间排序。file
命令打印文件内容简单描述,file log.log
。Linux
系统中的目录:
目录 | 描述 |
---|---|
/ | 根目录。 |
/bin | 包含系统启动和运行所必须的二进制程序。 |
/boot | 包含 Linux 内核、初始 RAM 磁盘映像(用于启动时所需的驱动)和 启动加载程序。 |
/dev | 这是一个包含设备结点的特殊目录。在这个目录里,内核维护着所有设备的列表。 |
/etc | 这个目录包含所有系统层面的配置文件。它也包含一系列的 shell 脚本, 在系统启动时,这些脚本会开启每个系统服务。crontab 定时任务,fstab 存储设备列表和相应挂载点,password 用户账户列表。 |
/home | 每个用户一个目录。 |
/lib | 核心系统程序用的共享文件 |
/lost+found | 每个使用 Linux 文件系统的格式化分区或设备,例如 ext3 文件系统, 都会有这个目录。 |
/media 或 /mnt(老的 Linux 版本) | 包含可移动介质的挂载点。 |
/proc | Linux 内核维护的虚拟文件系统,内核窥视孔。 |
/sbin | 系统二进制文件,通常为超级用户保留。 |
/tmp | 临时目录,重启会清空。 |
/usr/bin | 系统安装的可执行程序。 |
/usr/lib | 包含由/usr/bin 目录中的程序所用的共享库。 |
/usr/sbin | 包含许多系统管理程序。 |
/usr/share | 由/usr/bin 目录中的程序使用的共享数据。 |
/var | 存放动态文件,各种数据库,假脱机文件, 用户邮件等等。 |
/var/log | 这个/var/log 目录包含日志文件、各种系统活动的记录。其中最重要的一个文件是/var/log/messages。超级用户才能查看这些日志文件。 |
- 关于命令的命令
- type:解释一个命令
- which:显示会执行哪个应用程序(查看命令在哪)
- man:显示命令手册
- apropos:在一些特定的包含系统命令的简短描述的数据库文件里查找关键字,然后把结果送到标准输出(和
man -k
相同) - info:显示命令 info(类似于网页,可以跳转,方便阅读命令文档)
- whatis:显示一个命令简洁描述
- alias:创建命令(给详细的命令取别名),取消使用
unalias
- 重定向
- cat:连接文件
- sort:排序
- uniq:打印去除重复行
- grep:匹配
- wc:打印文件中换行符,字,和字节个数
- head/tail:打印头部或尾部
- tee:从
Stdin
读取数据,并同时输出到Stdout
和文件,ls | tee out.txt
。 >
重定向覆盖;>>
不覆盖。>ls-output.txt 2>&1
先重定向到ls-output.txt
再将标准错误(2
)重定向到标准输出(1
),注意顺序反的是不行的;缩写:&> ls-output.txt
。- 重定向输出结果到一个叫做”/dev/null”的特殊文件可以忽略输出。
grep -v
只打印不匹配的行;grep -i
忽略大小写。tail -f
实时浏览文件。
echo
- 支持正则表达式,如打印隐藏文件:
echo .[!.]?*
,直接echo .*
会将代表当前工作目录和父目录的.
和..
也打印出来。 - 支持算数表达式,
echo $((expression))
,如echo $((2+2))
。注意:只支持整数。 - 花括号展开,
echo {Z..A}
。花括号表达式本身可能包含一个由逗号分开的字符串列表,或者一个整数区间,或者单个的字符的区间。可嵌套,如echo a{A{1,2},B{3,4}}b
。 - 通过
$
调用变量,printenv
打印有效的变量列表。 - 命令替换,允许把一个命令的输出作为展开模式来用,例如
echo $(ls)
把ls
命令的结果作为一个临时变量打印出来。注意:除了圆括号加美元符,倒引号也可以支持命令替换,echo `ls`
。 - 双引号,双引号可以阻止单词的分割,如
ls -l two word.txt
是意味着列出two
和word.txt
的内容,改为ls -l "two word.txt"
就可以解决这个问题了。 - 单引号,禁止所有展开,不存在什么表达式,写啥就是啥。
- 转义字符,经常在双引号中使用转义字符,能转义的字符有 “$”, “!”, “&”, “ “ 等等,如
\$5.00
,单引号中反斜杠失去意义。echo
命令带上-e
选项,能够解释转义序列,可以把转义序列放在$' '
里面,例如echo -e "Time's up\a"
或echo "Time's up" $'\a'
都是可以的。
- 支持正则表达式,如打印隐藏文件:
- 命令行编辑
clear
清除屏幕,history
显示历史命令。ctrl-a
(ahead) 移动到行首,ctrl-e
(end) 移动到行尾,ctrl-l
相当于clear
,alt-f
(forward) 前一个单词,alt-b
(behind) 后一个单词。
权限
r
可读,w
可写,x
可执行。ls
命令显示的十个字符,第一个代表文件类型,后面九个字符分 3 组,分别表示用户、用户组、其他的权限。- 八进制数可以表示各种权限,因为权限有 3 类,组合方式就刚好只有
2^3=8
种,例如0
代表000
–---
,7
代表111
–rwx
,所以我们经常看到有chmod 777
这样类似的命令,就是通过 3 个数字用来修改文件或者文件夹的所有者、用户组、其他人的权限。 chmod
命令符号表示法:
u
是所有者(user
),g
是用户组(group
),o
是其他人(other
);+
用来添加权限,-
用来删除权限,=
用来设置权限(除设置外的其他权限都删除)。例如chmod go=rw file
意思是指定该文件的用户组和其他人拥有读权限和写权限,如果群组或者其他人之前拥有可执行权限则会被移除,而所有者的权限不会变动,-R
为递归赋予权限,只对文件夹有效。umask
设置默认权限,使用掩码设置,类似网络ip
之类的,umask 0022
展开就是000 000 010 010
,前三位先不管,后面依次对应所有者、用户组、其他人的权限,某一位如果为1
就把该位代表的权限删除,0022
就意味着删除用户组和其他人的写权限,只能读,默认的权限是--- rw- rw- rw-
,是默认没有可执行权限的。- 特殊权限,
setuid
(程序运行时从运行的用户切换到程序所有者用户)、setgid
(类似于setuid
把文件运行的所有组id
换成文件所有组id
))、sticky
(阻止用户删除和重命名文件),具体的可以查看 权限。 chown [owner][:[group]] file
更改文件的所有者或所有组。
进程
- 当系统启动的时候,内核先把一些它自己的活动初始化为进程,然后运行一个叫做
init
的程序。init
, 依次地,再运行一系列的称为init
脚本的shell
脚本(位于/etc
),它们可以启动所有的系统服务。 ps
简单查看进程。x
(注意不是-x
)选项显示进程在哪个终端控制的、状态(STAT
,R
正在运行,S
正在睡眠,D
不可中断睡眠,T
已停止,Z
一个死进程,<
一个高优先级级才能更,N
低优先级进程),启用的命令(这个可能很有用)。ps aux
是经常用的一个显示更加详细信息的命令,top
程序以进程活动顺序显示连续更新的系统进程列表。以CPU
使用率排序。- 一个进程放到后台执行,只要在后面加上
&
字符,如vi foo.txt &
。 - 将进程放回前台执行,先用
jobs
找到对应的任务,比如[1] suspended(tty output) vi foo.txt
,任务就是1
,接着使用fg
(可以foreground
记忆) 命令fg %1
。 Ctrl-Z
停止一个前台任务,将任务移动到后台。同样地使用fg
命令可以将后台进程移动到前台。kill [-signal] PID
,发送信号给对应PID
的进程,默认是终止信号(TERM
)。signal
可以用数字也可以用字母,建议用字母,好记,HUP
挂起,INT
中断(类似Ctrl-C
),KILL
杀死(不通知进程,直接在内核杀死),TERM
终止,CONT
发送停止信号后可以使用这个来恢复,STOP
停止进程。kill -l
列出完整信号列表。pstree
输出一个树型结构的进程列表,这个列表展示了进程间父/子关系。
- 当系统启动的时候,内核先把一些它自己的活动初始化为进程,然后运行一个叫做