完整的Linux命令行教程参见TLCL.
这里仅对我这个菜鸟平时常用的命令进行整理。
1 基本操作
1.1 更改目录
- cd 命令
进入某个文件夹或者说切换当前目录到指定路径,最基本的就是cd directory
命令,而目录可以是相对路径或者绝对路径。还有一些简化表示:
cd ..
切换到上一级目录cd ~
切换到用户目录cd -
切换到前一步目录(后退)
- pushd 命令
如果需要来回在多个目录间进行切换,cd
的效率太低,用pushd
命令替换cd
命令可以极大提高效率。需要配合几个命令一起使用。pushd
和popd
是对一个目录栈进行操作,而dirs
是显示目录栈的内容。而目录栈就是一个保存目录的栈结构,该栈结构的顶端永远都存放着当前目录,如果栈顶目录发生变化,则当前目录必然进行相应的切换。
dirs -v
每行显示目录栈中的一条记录,同时展示该记录在栈中的indexdirs -c
清空目录栈pushd directory
切换到指定目录,并且将该目录置于目录栈的栈顶。默认还会执行一个dirs
命令来显示目录栈的内容。pushd
将目录栈最顶层的两个目录进行交换。同时意味着切换至新的栈顶目录。(相当于cd -
)pushd +n
切换到目录栈中的第n个目录(这里的n就是dirs -v
命令展示的index),并将该目录以栈循环的方式推到栈顶。popd
将目录栈中的栈顶元素出栈,同时切换至新的栈顶目录popd +v
将目录栈中的第n个元素删除(这里的n就是dirs -v
命令展示的index)
2 重定向
一般来说,输入来自键盘,输出送到屏幕, 但是通过 I/O 重定向,我们可以做出改变。
2.1 标准输出重定向
使用 “>” 重定向符后接文件名将标准输出重定向到除屏幕 以外的另一个文件。
当我们使用 “>” 重定向符来重定向输出结果时,目标文件总是从开头被重写。
使用”>>“操作符,将导致输出结果添加到文件内容之后。如果文件不存在,文件会被创建。
2.2 标准错误重定向
标准错误重定向没有专用的重定向操作符。
一个程序可以在几个编号的文件流中的任一个上产生输出。这些文件流的前三个称作标准输入、输出和错误,shell 内部分别将其称为文件描述符0、1和2。可以使用文件描述符实现标准错误重定向:
[me@linuxbox ~]$ ls -l /bin/usr 2> ls-error.txt
同时重定向标准输出和标准错误:
[me@linuxbox ~]$ ls -l /bin/usr &> ls-output.txt
2.3 标准输入重定向
- cat(连接文件)
- 管道线
- 过滤器
- uniq(报道或忽略重复行)
- wc(打印行数、字数和字节数)
- grep(打印匹配行)
- head / tail(打印文件开头部分/结尾部分)
- tee(从 Stdin 读取数据,并同时输出到 Stdout 和文件)
3 文件管理
3.1 查看文件和文件夹大小
- 查看目前所有文件系统的可用空间及使用情形
df -h
- 查看文件或文件夹的磁盘使用空间
du -h --max-depth=1 your_dest_dir
- 可以调节--max-depth参数,用来控制你想要查看的目录的深度。
- 注意,该命令只会返回目标文件夹和目标文件夹下首层文件夹的大小,不会返回更深层的文件夹的大小,也不会返回文件的大小。
- 要想返回更深层的文件夹的大小,可以设置--max-depth为更高的数值,或者干脆取消--max-depth参数,这样它就会返回目标文件夹下所有子文件夹的大小,不管其深度(但仍不会返回文件大小,其实,想看文件大小,直接在目标目录下运行命令 ls -htla就可以啦!)。
要还想返回目标文件夹下首层的文件大小,可以使用下述命令:
du -h --max-depth=0 your_dest_dir/*
4 进程
4.1 查看进程
- jobs 命令
- 列出从终端中启动的任务。
- ps 命令
- 默认情况下,
ps
不会显示很多进程信息,只是列出与当前终端会话相关的进程。为了得到更多信息, 我们需要加上一些选项。 ps x
展示所有进程,不管它们由什么终端(如果有的话)控制。在 TTY 一栏中出现的 “?” ,表示没有控制终端。ps aux
显示属于每个用户的进程信息。
- top 命令
ps
命令只是提供 ps 命令执行时刻的机器状态快照。为了看到更多动态的信息,我们使用 top 命令。top
程序以进程活动顺序连续更新显示系统进程列表(默认情况下,每三秒钟更新一次)。显示结果由两部分组成:最上面是系统概要,下面是进程列表,以 CPU 的使用率排序。top
程序接受一系列从键盘输入的命令。h
显示程序的帮助屏幕,q
退出 top 程序。
4.2 后台执行
在程序命令之后加上&
字符可以让程序在后台运行。
- 一个在后台运行的进程对一切来自键盘的输入都免疫,也不能用 Ctrl-c 来中断它。中断一个后台运行的进程有很多方法,比如让进程返回前台 (foreground),可以使用
fg
命令,参数为一个百分号和任务序号(叫做 jobspec,如此处的%1),然后使用 Ctrl-c 来中断程序。 - 如果想要将已经开始运行的程序切换为后台运行,先输入 Ctrl-z 来停止程序,然后使用
bg
命令加上%jobspec
参数即可。
另外,当用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务,有可能由于网络的不稳定导致任务中途失败。让命令提交后不受本地关闭终端窗口/网络断开连接的干扰的方法:当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。因此,解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程,详细做法讲解。
4.3 kill命令和信号
使用 kill 命令,并且指定我们想要终止的进程 PID。也可以用 jobspec(例如,“%1”)来代替 PID。
kill 命令被用来给程序发送信号。它最常见的语法形式看起来像这样:
kill [-signal] PID...
其中信号既可以用号码,也可以用名字来指定。
编号 | 名字 | 含义 |
---|---|---|
1 | HUP | 挂起(Hangup)。关闭一个终端会话可以展示这个信号的作用。在当前终端运行的前台程序将会收到这个信号并终止。许多守护进程也使用这个信号来重新初始化。这意味着当一个守护进程收到这个信号后会重新启动,并且重新读取它的配置文件。 |
2 | INT | 中断。实现和 Ctrl-c 一样的功能,由终端发送。通常,它会终止一个程序。 |
9 | KILL | 杀死。程序可能会选择不同的方式来处理发送给它的信号,包含忽略信号,但是 KILL 信号不被发送到目标程序,而是内核立即终止这个进程。当一个进程以这种方式终止的时候,它没有机会去做些“清理”或者保存工作。所以把 KILL 信号看作最后一招,当其它终止信号失败后再使用它。 |
15 | TERM | 终止。这是 kill 命令发送的默认信号。如果程序仍然“活着”,可以接受信号,那么它会终止。 |
19 | STOP | 停止。这个信号导致进程停止运行,而不是终止。像 KILL 信号,它不被发送到目标进程,因此它不能被忽略。 |
20 | TSTP | 终端停止(Terminal Stop)。当按下 Ctrl-z 组合键后,终端发送这个信号。不像 STOP 信号,TSTP 信号由目标进程接收,可能被忽略。 |
18 | CONT | 继续。在一个停止信号后,这个信号会恢复进程的运行。 |
3 | QUIT | 退出 |
11 | SEGV | 段错误(Segmentation Violation)。如果一个程序非法使用内存,就会发送这个信号。 |
28 | WINCH | 改变窗口大小(Window Change)。当改变窗口大小时系统会发送这个信号。一些程序,像 top 和 less 程序会响应这个信号,按照新窗口的尺寸刷新显示的内容。 |
5 权限
Linux系统的多用户特性决定了它需要一套权限机制来管理这些用户的操作规范,从而确保系统安全。
通过执行ls -l filename
可以查看一个文件(或目录)的属性,如:
-rw-rw-r-- 1 me me 0 2008-03-06 14:52 foo.txt
其中第1个字符表示文件类型:
属性 | 类型 |
---|---|
- | 普通文件 |
d | 目录 |
l | 符号链接,显示指向的文件的属性 |
c | 字符设备文件,如调制解调器 |
b | 块设备文件,如硬盘或CD-ROM盘 |
第2~10个字符依次对应着拥有者、组成员和其他人对该文件的3种权限的规定。
5.1 三种身份
- 拥有者。当一个用户拥有一个文件(或者目录)时,他首先对这个文件(或者目录)拥有控制权,即他可以决定其他用户对这个文件(或目录)享有的权限。
- 组成员。每个用户可以属于多个用户组。
- 其他人。
5.2 三种权限
属性 | 文件权限 | 目录权限 |
---|---|---|
r | 允许打开并读取文件内容。 | 允许列出目录中的内容,前提是目录必须设置了可执行属性(x)。 |
w | 允许写入文件内容或截断文件。但是不允许对文件进行重命名或删除,重命名或删除是由目录的属性决定的。 | 允许在目录下新建、删除或重命名文件,前提是目录必须设置了可执行属性(x)。 |
x | 允许将文件作为程序来执行,使用脚本语言编写的程序必须设置为可读才能被执行。 | 允许进入目录,例如:cd directory 。 |
5.3 更改文件模式(权限)
只有文件的拥有者或者超级用户才能使用chmod
命令更改文件或目录的权限,具体方法:
- 可以通过3个八进制数字指定。
chmod 777 foo.txt
八进制 | 二进制 | 文件模式 |
---|---|---|
0 | 000 | --- |
1 | 001 | --x |
2 | 010 | -w- |
3 | 011 | -wx |
4 | 100 | r-- |
5 | 101 | r-x |
6 | 110 | rw- |
7 | 111 | rwx |
- 符号表示法。影响谁、执行什么操作、设置什么权限。
chmod u+x foo.txt
符号 | 含义 |
---|---|
u | "user"的简写,意思是文件或目录的所有者。 |
g | 用户组。 |
o | "others"的简写,意思是其他所有的人。 |
a | "all"的简写,是"u", "g"和“o”三者的联合。 |
可以执行的操作有:+
增加权限,-
删掉权限,=
指定权限
5.4 更改文件所有者和用户组
chown [owner][:[group]] file
参数 | 含义 |
---|---|
bob | 把文件所有者从当前属主更改为用户 bob。 |
bob:users | 把文件所有者改为用户 bob,文件用户组改为用户组 users。 |
:admins | 把文件用户组改为组 admins,文件所有者不变。 |
bob: | 文件所有者改为用户 bob,文件用户组改为用户 bob 登录系统时所属的用户组。 |
6 管理软件包
6.1 两种打包系统
- Debian Style(.deb): Debian, Ubuntu等
- RedHat Style(.rpm): Fedora, CentOS, RedHat Enterprise Linux等
由于我使用的Ubuntu系统属于Debian风格,所以后面只介绍Debian风格系统的操作。
6.2 软件包管理系统的两种工具
- 上层工具:apt-get
- 底层工具:dpkg
6.3 资源库和依赖性
- 现在大多数软件包是由发行商和感兴趣的第三方创建的。系统发行版的用户可以在一个中心资源库中得到这些软件包,这个资源库可能包含了成千上万个软件包,每一个软件包都是专门为这个系统发行版建立和维护的。
- 程序很少独立工作;他们需要依靠其他程序的组件来完成他们的工作。现代的软件包管理系统都提供了一些依赖项解析方法,以确保安装软件包时,其所有的依赖也被安装。
6.4 软件包管理命令
功能 | 命令 |
---|---|
在资源库中查找软件包 | apt-get update; apt-cache search search_string |
安装资源库中的软件包 | apt-get update; apt-get install package_name |
通过软件包文件安装软件包(不解析依赖) | dpkg --install package_file |
卸载软件包 | apt-get remove package_name |
通过资源库更新软件包 | apt-get update; apt-get upgrade |
通过软件包文件升级软件 | dpkg --install package_file |
查看已安装软件包列表 | dpkg --list |
检查软件包是否已经安装 | dpkg --status package_name |
查询软件包的信息 | apt-cache show package_name |
查找安装某文件的软件包 | dpkg --search file_name |