系统学习 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输出一个树型结构的进程列表,这个列表展示了进程间父/子关系。
- 当系统启动的时候,内核先把一些它自己的活动初始化为进程,然后运行一个叫做