阅读Linux/UNIX系统编程闲暇之余阅读Linux命令行大全这本书,想起当初毕业同学送给我时的场景,书很新,新到什么程度呢,我说这书时昨天刚买的都没毛病。
本篇博客只记录一些印象不太深刻的内容,相对较简单或对我来说比较熟练的,不再记录.
shell是一个接受由键盘输入的命令,并将其传递给操作系统来执行的程序。bash是Bourne Again Shell的首字母缩写,Bourne Again Shell基于这样一个事实,即bash是sh的增强版本,而sh是最初的UNIX shell程序,由Steve Bourne编写。

结束终端会话

直接关闭终端窗口或是在shell提示符下输入exit命令,即可结束终端会话。
第一次登录系统时,当前工作目录被设置成主目录。每个用户账号都有一个主目录,作为普通用户操作时,这是唯一一个允许用户写文件的地方。
cd的快捷方式:
cd 将工作目录改变成主目录
cd - 将工作目录切换到先前的工作目录
cd ~ 切换到当前登录用户的主目录
cd ~username 切换到用户username的主目录

ls

ls可以指定多个目录显示,下面的例子显示用户主目录与/usr目录的内容
root@ubuntu:~# ls ~ /usr
/root:
display.c fun main main.o strtol tlpi-book workspace
display.o fun.c main.c playground strtol.c tlpi-dist
/usr:
bin games include lib local locale sbin share src

大部分命令使用的选项是在单个字符前加上连字符,如 -l。但是很多命令,包括GNU项目里的命令,也支持在单字前加两个连字符的长选项,并且很多命令允许长短选项一起使用。下面的例子:ls命令-l产生长格式输出,而t选项则表示以文件修改时间的先后将结果进行排序,加上长选项--reverse则结果以相反的顺序输出。

cp命令

cp命令用来复制文件和目录。它有两种不同的使用方式:
cp item1 item2
将单个文件或目录item1复制到文件或目录item2中。
cp item…… directory
将多个项目(文件或目录)复制进一个目录中
最常用的命令选项
-r --recursive 递归地复制目录及其内容,复制整个目录时需要该选项。
-u --update 当将文件从一个目录复制到另一个目录时,只会复制那些目标目录中不存在的文件或是目标目录相应文件修改时间较新的文件。

rm删除文件和目录

tips:当rm命令与通配符一起使用是应仔细检查输入的命令,可以使用ls预先对通配符做出测试,这显示将要删除的文件.

硬链接 软链接

Linux软链接与硬链接

man

man命令显示的手册文档被分成多个部分,它不仅包括用户命令,也包括系统管理命令、程序接口、文件格式等。
手册文档的组织结构:

1.              用户命令
2.              内核系统调用
3.              C库函数程序接口
4.              特殊文件,如设备结点和驱动程序
5.              文件格式
6.               游戏和娱乐,如屏幕保护程序
7.             其它项
8.              系统管理命令

当我们查找的一个文件格式同时也是一个命令时,就要指明查找的部分,如果不指明查找的部分会显示第一次匹配的实例。
例如:
man 5 passwd 与 man passwd
man 5 passwd显示文件/etc/passwd的文件格式描述手册
man passwd会显示用户命令passwd
关于这一点可以用whatis来验证。

root@ubuntu:~# whatis ls
ls (1)               - list directory contents
root@ubuntu:~# whatis passwd
passwd (5)           - the password file
passwd (1)           - change user password
passwd (1ssl)        - compute password hashes

whatis程序显示匹配具体关键字的手册页的名字和对应的描述。

alias


这种设置有一个问题:shell会话结束时,这些别名会随之消失。

重定向

翻这本书到现在第六章,终于有点重要的内容,也是我所要重点学习的部分-重定向。

标准输入 标准输出 标准错误

默认情况下,标准输出和标准错误都被链接到屏幕上。
标准输入链接到键盘。I/O重定向的功能可以改变输出内容发送的目的地,也可以改变输入内容的来源。通常情况下,输入来自于键盘,输出内容显示在屏幕上,重定向可以改变这一惯例。

标准输出重定向

ls -l /usr/bin > ls-ouput.txt
这里我们将创建/usr/bin目录的一个长列表信息,并把这个显示结果输出到文件ls-output.txt.我们可以使用ls -l ls-output.txt查看文件情况。
接着可以把目录名换成一个不存在的目录名,例如:
ls -l /bin/usr > ls-ouput.txt
我们会收到错误提示:No such file or directory,由于我们没有重定向标准错误,所以错误信息还是直接打印在屏幕上。
这个时候我们通过ls -l命令查看ls-output.txt,吃惊的发现文件被清空了!
原因是我们使用>来重定向标准输出时,目的文件通常会从文件头部重新写。由于ls命令执行后没有任何标准输出,所以重定向操作开始重新改写这个文件,并在出现错误的情况下停止操作,最终导致了该文件内容被删除。
这就为我们提供了一种快速清空文件内容的方法:

> ls-output.txt

如果要在文件后面追加内容,而不是每次都从头开始写入的话可以使用>>来实现,下面的操作执行了两次,文件ls-output的大小翻倍.

标准错误重定向

标准输入 输出 错误对应的文件描述符分别是0 1 2,那么我们重定向标准错误可以采用如下方法:
ls -l /bin/usr 2> ls-error.txt
如果ls信息显示有误,会将相应的错误信息写入文件ls-error.txt,如果ls信息显示无误则列出相应目录的内容。
文件描述符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-output.txt.
操作示例:

上面的例子我们演示了使用第一种方法可以重定向标准错误和标准输出,由于标准输出内容较多,所以我们只显示了10行来验证。

处理不想要的输出

可以通过输出重定向到/dev/null的特殊文件中来实现。例:
ls -l /bin/usr 2> /dev/null
可以抑制一个命令的错误信息。

标准输入重定向

cat 命令
读取一个或多个文件,并把他们复制到标准输出文件。
合并多个文件:
假如有文件被拆分成如下文件:
movie.mpeg.001 movie.mpeg.002 movie.mpeg.003 movie.mpeg.004 …… movie.mpeg.099
可以使用如下命令将它们重新连接在一起:
cat movie.mpeg.0* > movie.mpeg
由于通配符按顺序扩展,因此这些参数将按照正确的顺序来排列。
假如文件ls-output.txt里面有abcdefgh内容,我用如下命令:
cat < ls-output.txt
使用重定向符号"<",我们将把标准输入的源从键盘变为文件ls-output.txt.

管道

管道操作符 | 可以把一个命令的标准输出传送到另一个命令的标准输入中。
ls -l /usr/bin | less
使用less命令可以分页显示任意命令的输入,该命令将它的结果发送到标准输出。
ls /bin /usr/bin | sort | less
把/bin和/usr/bin目录下所有可执行程序合并成一个列表,并且按照顺序排序。
ls /bin /usr/bin | sort | uniq | less
uniq命令会剔除掉/bin 和/usr/bin目录下都有得文件名,只显示一次。
ls /bin /usr/bin | sort | uniq | wc -l
可以查看已排好序的列表中条目数。

tee

在执行Linux命令时,我们可以把输出重定向到文件中,比如 ls >a.txt,这时我们就不能看到输出了,如果我们既想把输出保存到文件中,又想在屏幕上看到输出内容,就可以使用tee命令了。要注意的是:在使用管道线时,前一个命令的标准错误输出不会被tee读取。

echo



这本书看到这又一个惊喜,就是出现了这个花括号扩展,按照年份 月份甚至日期创建文件夹都变得如此轻松。
查看可用的变量列表可以使用如下命令:
printenv | less

高级键盘技巧

Ctrl + A移动光标到行首
Ctrl + E移动光标到行尾
输入history可以查看命令历史记录:
!! 重复执行最后一个执行的命令
!number 重复历史记录中第number行的命令

权限

UNIX/Linux操作系统是多任务多用户系统.
id:显示用户身份标识
chmod:更改文件的模式
umask:设置文件的默认权限
sudo:以另一个用户的身份来执行命令
su:以另一个用户的身份运行shell
chown:更改文件所有者
chgrp:更改文件所属群组
passwd:更改用户密码

更改身份su sudo

su -l [user] 指定用户登录

如果没有指定用户,那么默认切换到超级用户,-l可以缩写为-,而且这一形式经常被使用。
su -
在使用结束后可以输入exit,返回之前的shell环境。
su -c 'command'
使用su命令执行单个命令,而不需要开启一个新的交互式命令行界面。例:
su -c 'ls -l /root/*'

sudo以另一个用户的身份执行程序

在特定的情况下,用户可以被限制为只能执行一条或者几条特定的命令,而对其他命令没有执行权限。另一个重要的区别在于,使用sudo命令并不需要输入超级用户的密码。
sudo命令并不需要启动一个新的shell环境,而且也不需要加载另一个用户的运行环境。
在书中权限这一章的一个实例中我们注意到:
ls -ld 文件名可以查看文件夹对应的信息
如果不加d,会列出文件夹下文件的信息

root用户更改其它用户密码

登录root用户,输入passwd <用户名>

进程

这本书浏览到这,又一知识盲点,重点详细记录本章知识点。
现代操作系统都支持多重任务处理。多重任务处理是指系统通过快速切换云雄中的程序来实现多任务的同时执行。Linux内核通过使用进程来管理多重任务。进程是Linux用来安排不同程序等待CPU调度的一种方式。

使用ps命令查看进程信息

R (TASK_RUNNING),可执行状态。
runnable (on run queue),正在运行或在运行队列中等待的进程
S (TASK_INTERRUPTIBLE),可中断的睡眠状态。
sleeping,处于这个状态的进程因为等待某某事件的发生(比如等待socket连接、等待信号量),而被挂起。
D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态。
uninterruptible sleep (usually IO),进程处于睡眠状态,但是此刻进程是不可中断的。不可中断,指的并不是CPU不响应外部硬件的中断,而是指进程不响应异步信号。
T (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态。
traced or stopped,进程处于睡眠状态,但是此刻进程是不可中断的。不可中断,指的并不是CPU不响应外部硬件的中断,而是指进程不响应异步信号。(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行)。
Z (TASK_DEAD - EXIT_ZOMBIE),退出状态,进程成为僵尸进程。
a defunct process,在这个退出过程中,进程占有的所有资源将被回收,除了task_struct结构(以及少数资源)。
< 高优先级进程。
N   低优先级进程。

常用ps组合命令:
ps -aux
显示属于每个用户的进程信息。
top命令动态查看进程信息,参考linux命令行大全书中的内容:

进程控制

在介绍进程控制时会用到一个小程序xlogo,如果系统中没有这个小程序的话要进行安装。
man xlogo
DESCRIPTION
xlog is a logging program for Amateur Radio Operators. The main window consists of a button bar, QSO frame, and a browseable log. Logs will be saved to a flat text file. You can create, open and close logs as you need them.
该示例程序只是简单的显示一个包含X表示的可缩放窗口。
终端进程使用Ctrl +C键,暂停进程使用Ctrl + Z键

使进程在后台运行

xlogo &
通过ps我们可以看到xlogo在后台运行。
在后台运行的应用场景:假设我们想要shell提示符返回,但又不终止xlogo程序,那么可以让xlogo在后台运行来实现。
shell的作业控制特性也提供了一种方式来查看从该终端启动的所有作业。使用jobs命令可以得到在后台运行的程序信息。

让进程从前台切换到后台运行,在执行xlogo后输入Ctrl+Z,暂停程序运行,输入bg %编号,ps查看进程

信号

kill命令杀死进程
kill PID
kill命令准确的说并不是杀死进程,而是给进程发送信号(signal)。信号是操作系统和进程间通信的多种方式之一。
在使用Ctrl+C时它将发送一个称为INT(中断,Interrupt)的信号,在按下Ctrl+Z的情况下,它将发送一个称为TSTP(终端暂停,Terminal Stop)的信号。
使用killall命令可以发送信号给多个进程
比如xlogo &执行多次,输入killall xlogo可以kill掉所有我们打开的程序。
和kill命令一样,必须具有超级用那个胡权限,才能使用killall命令给不属于自己的进程发送信号。