阅读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预先对通配符做出测试,这显示将要删除的文件.
硬链接 软链接
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