善用重定向提高工作效率

善用重定向提高工作效率

文件的输入/输出重定向是Linux系统中一个重要的机制。借助于重定向用户往往可以比较轻松地完成某些任务,
从而提高工作效率。本文结合作者的使用经验,列举和总结了一些使用输入/输出重定向的实例和技巧。

文件输入,输出和错误输出

当 Shell 运行一个新的应用程序或命令时,它会为进程自动创建三个文件描述符,即标准输入(stdin),标准输出(stdout)
和标准错误输出(stderr)。它们被分别赋值为 0,1 和 2。标准输入通常默认为终端的键盘,标准输出和标准错误输出通常
默认为终端的屏幕。在默认情况下,应用程序会从 stdin 中取得输入数据,并把输出数据和出错信息分别传送给 stdout 和
stderr。重定向就是要改变这些 stdin、stdout 及 stderr 默认的去向。重定向包括输入重定向和输出重定向。

输出重定向

简单地说,输入重定向就是把应用程序的标准输出或标准错误输出重新定向到某个指定的文件,而不是原来默认的标准输出,
比如屏幕。它的操作符是">"或">>"。运用输出重定向可以比较方便地生成,编辑某些文件;比较容易地和系统中的某些设备文件进行交互。
下面是一些实例。

列出 home 目录下所有的 csv 文件并把结果保存到文件 csv.out 中:
[code:1][wei@amt55 home]# find /home -name "*csv" > csv.out[/code:1]
获取系统内存使用信息并追加到文件 sysinfo.out 中:
[code:1][root@amt55 info]# cat /proc/meminfo >> sysinfo.out[/code:1]
如果不想让别人在网络上 ping 到自己的机器,可以这么做:
[code:1][root@amt55 /]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all[/code:1]  
如果不想看到某个命令执行的结果,可以这样将其丢弃:
[code:1][root@amt55 /]# ls -aR /home/wei > /dev/null[/code:1]
把文件 backup.tar 拷贝到软盘里:
[code:1][root@amt55 ladungmss]# cat backup.tar > /dev/fd0 [/code:1]
迅速清空文件 parametertest.in 中的内容:
[code:1][root@amt55 ladungmess]# cat /dev/null > parametertest.in [/code:1]
想播放声音文件 wallstart.au 吗,太简单了:
[code:1][root@amt55 sounds]# cat wallstart.au > /dev/audio [/code:1]
直接把文件 dma.ps 送到打印设备去打印:
[code:1][root@amt55 ladungmess]# cat dma.ps > /dev/lp[/code:1]
在当前目录 ladungmess 下快速创建一个名为 rawdata.csv 的空文档:
[code:1][root@amt55 ladungmess]# cd /home > rawdata.csv
#或者
[root@amt55 ladungmess]# cp wei001.csv /home/ > rawdata.csv
#这是因为命令 cd 或 cp是不产生输出的,所以把它们运行的结果重定向到一个文件,文件自然是空的。
下一节还将介绍一个利用输入重定向来创建空文件的例子。
[/code:1]
将当前目录下包含的所有内容备份为一个文件 backup.tar:
[code:1][root@amt55 ladungmess]# tar cf - . > backup.tar
#上面的命令巧妙地运用了两个输出重定向,即"-"和">"。对"-"的解释可以参见下一节中关于 tar 的例子。[/code:1]


输入重定向
输入重定向是把应用程序的标准输入重新定向到指定的文件。这就可以使程序的输入源不限于键盘,也可以来自文件。
输入重定向的操作伏符是"<"或">>"。与输出重定向相比,输入重定向运用的地方要少一些。不过在某些情况下使用它们
可以起到很好的效果。下面是一些实例。

在当前目录下快速创建一个空文档 rawdata.dat:
[code:1][root@amt55 ladungmess]# cat > rawdata.dat < /dev/null [/code:1]
在局域网上给其他人发送信息:
[code:1][root@amt55 ladungmess]# mail -s "The experiement results" user1 user2 < rawdata.dat [/code:1]
统计文件 ladvertest.out 中的行数和字数:
[code:1][root@amt55 ladungmess]# wc -l -w < ladvertest.out[/code:1]
利用 Here 文档把两个分隔符 END 之间的文本保存到文件 expfile:
[code:1][root@amt55 ladungmess]# cat > expfile << END
< The experiment file
< ladvertest.in ladvertest.out
< END
[/code:1]
将当前目录 ladungmess 下的所有东西打包压缩,快速移动到另一个目录 backup 下:
[code:1][root@amt55 ladungmess]# tar cf - . | (cd /home/wei/backup; tar xvfp -)
# 这个命令对于在不同目录之间转移文件很有用。需要注意的是这里的重定向与前面那些例子不太一样,其标志是符号"-"'。
# 第一个"-"是一个输出重定向,它要求 tar 的输出(压缩的包)不是某个磁盘文件,而是 stdout,这个 stdout
# 通过管道变为第二个命令 tar 的 stdin; 第二个"-"是一个输入重定向,它要求第二个 tar 的输入不是来自某个磁盘文件,
# 而是来自 stdin,也就是由管道传来的第一个 tar 的 stdout。
[/code:1]
最后介绍一个目前实验数据处理中碰到的使用重定向的例子。为了从测量数据中得中纳米颗粒的电荷分布,需要运行某些与用户交互的程序。
其中的一个程序是 parameter,是用 C++编写的。它用来读取实验数据,并按照用户提供的与颗粒有关的各种参数去拟合出一个与实验数据最接近的分布。
这实质上是一个不断尝试(trial-and- error)的过程。因为不能保证只通过一次或几次运行程序就得到理想的结果。每次运行 parameter
我都要连续从键盘输入十一个参数 (为了便于理解,我把 parameter 的源程序放在 这里 )。这样做有几个不合适的地方:
一是参数比较多,输入一次要占用不少时间。其次大部分参数在调整几次后就不需要再变了,而文件名在某次实验中一直都是不变的,
但是下一次运行程序时所有这些都还要重新输入。再有多次输入也容易发生输错的情况。输入重定向帮我很好解决了这一问题:
把这十一个参数按照它们在程序中出现的次序放在一个名为 parametertest.in 的文件中,格式如下(对应其中某一次输入,
第一行 parametertest.csv 是实验数据文件名):
[code:1]prametertest.csv11-6000 -5400
1.05 1.20.066 0.0681e3 1e5 [/code:1]
然后运行:
[code:1][root@amt55 ladungmess]# ./parameter < parametertest.in [/code:1]

现在立刻就可以获得计算结果了。如果不满意,下一次尝试我只要在文件 parametertest.in
中修改那些需要改变的参数就行了。很明显,由于输入重定向接管了每次从键盘输入的工作,所以运行程序的效率大大提高了。
如果对输入的参数满意了,可以再使用一个输出重定向:
[code:1][root@amt55 ladungmess]# ./parameter < parametertest.in > parametertest.out [/code:1]
把计算结果保存到文件 parametertest.out 中。 

结论
重定向能够运用的场合很多,上面列举的十几个例子只是其中很小的一部分。不过从这有限的例子中不难发现,运用重定向处理某些问题是相当巧妙和简洁的,善
利用重定向往往会给工作带来许多方便,从而显著地提高工作效率。
不错!
好东东。谢谢
hobby!兄,俺把你的帖子编辑了一下,格式化了代码,如果觉得有问题,还请站内信件告知。

另,加精鼓励
好。 基础知识必须牢固掌握 。
恩,不错,虽然是最基本的东东,但我学到不少,谢hobby兄!
[quote:fa4702f282="jerry_cym"]恩,不错,虽然是最基本的东东,但我学到不少,谢hobby兄! [/quote]
俺辛辛苦苦排版,居然不谢俺,哼
拉出去,打PP
[quote:878a540cf1="MichaelBibby"][quote:878a540cf1="jerry_cym"]恩,不错,虽然是最基本的东东,但我学到不少,谢hobby兄! [/quote]
俺辛辛苦苦排版,居然不谢俺,哼
拉出去,打PP [/quote]

版主挑眼了!