黑蝙蝠

cat命令及重定向输入输出命令

cat命令及重定向输入输出命令

在linux系统的shell脚本编程中,有些时候我们需要在脚本程序的执行过程中输出一些文件,这些文件可能是一个简单的文本文档、对脚本执行过程中产生的一些数据的记录或者根据需要建立输出一个新的脚本到系统中等等。对于这样的情况我们可以采用cat和重定向输入输出命令集合来进行解决,下面就此做一个简单的介绍。

一、cat命令

cat命令是linux一个用于查看文件内容的命令,该命令会将输入的内容输。一般情况下这里的输入会是一个跟着cat后面的参数,而输出这是控制台。所以该命令最简单的作用就是将一个文件的内容显示到控制台,以便我们查看其中的内容。

但是正如上面提到的只是一般情况一样,那就有特殊的情况。当我们在使用cat命令时如果后面没有添加任何参数,那么此时cat的输入就是控制台而输出也是控制台,并且此时没输入一行就会显示一行,在这种情况下我们如果要终止输入则需要借助ctr+d快捷键结束输入或者ctr+c快捷键向程序发出信号SIGINT终止该进程。

注:如果ctrl+d时当前行没有输入字符, bash把它当作EOF字符, 结束/退出.如果ctrl+d时当前行有输入, 删除光标后的字符. 这是readline的特性, 不发送信号. 具体可通过命令man bash 或man readline进行查阅。

二、重定向输入输出命令“>”、“>>”、“<”、“<<”

两个重定向输入命令有“<”和“<<”,这两个命令都是用于将输入进行重定向的:

命令“<”的使用为“[n]< word”,在bash手册中的解释为将以“word”扩展开来的文件打开,作为文件描述符n的输入,如果没给出文件描述符n,那么n将默认为0即标准输入。

命令“<<”的使用为“<< [ - ] word”,该命令不会对word进行任何扩展,它的作用是将当前源作为shell的输入直到遇到一个只存在结束符的行。其中结束符是由word指明的,其规则为将word中的字符去掉被引号“”引起来的内容剩余的。通常即word本身。另外其中的可选项[-]如果给出的话,那么输入中的每行开头的制表符将被滤除。

两个重定向输出命令“>”、“>>”,这两个命令均用于进行重定向输出的。我们先来看“>”命令,该命令的使用为“[n]>word”,首先n依然是要输出的文件描述符,如果没有给出那么将默认为标准输出,而word则会扩展为需要输出到的文件。对于该命令如果shell已将noclobber选项设置,那么当输出时如果目标文件已存在则bash会报错“文件已存在”。反之则不会报错但是却会把原有文件中的内容全部覆盖掉。Noclobber选项设置后会不允许文件的覆盖,经通过“set  -o noclobber”命令允许,关闭可以使用“set +o noclobber ”。

另外一个重定向输出命令“>>”的使用方法为“[n]>>word”,该命令中的参数的意思和上面几个的一样,都是文件描述符以及目标文件。该命令和上一个重定向输出命令的不同点之一在于该输出并不会覆盖原有的文件而是附加在原有文件的后面。并且当输出的目标文件不存在时也会自动的创建。

以上是关于四个重定向输入输出命令的简要描述,如果想要获得更详细的讲解可通过“man bash”命令查看bash手册中关于重定向一节。

三、常见的使用例子

通过上面的介绍,现在我们对于cat命令及重定向命令已经都有了一个简单的了解,接下来就看几个常用的使用例子来初步认识一下:

1、命令cat > test.sh,该命令将标准输入作为输入然后将输出重定向到test.sh如果该文件已经存在则将其内容进行覆盖。

2、组合命令cat << EOF > test.sh,该组合命令使用“<<”将cat命令的输入重定向到当前输入源并以一个只存在“EOF”的行作为输入的结束,然后通过“>”将组合命令“cat << EOF”的输出重定向到文件test.sh,并且如果文件不存在则创建它,存在则将文件进行覆盖重写。

3、组合命令cat << EOF >> test.sh,该命令将组合1的重定向输出命令换为了“>>”,所以在该命令执行时,如果文件已存在则只是将新内容追加到最后而不会覆盖原有的内容。

4、组合命令cat > test.sh << EOF,该组合命令的作用和一是相同的,只是这个命令的意思是将cat的输出重定向到test.sh并且如果存在这覆盖之,然后将组合命令cat > test.sh的输入重定向到当前输入源并以“EOF”作为结束的标志。

5、组合命令cat << HHH > test.sh,该组合命令的意思和作用和组合命令一是完全相同的,所不同的只是将输入的结束符重“EOF”换成了“HHH”。

四、总结

从上面的学习中可以看出在每一个组合命令中发挥神奇作用并不是cat命令本身,而是紧随其后的重定向命令。最后要说的是对于上文中提到的“当前输入源”是指:如果你是在终端输入命令并执行的,那么这个当前输入就是终端了,如果你是在写在脚本里并通过脚本执行的,那么当前输入源就是你的脚本,这就意味着在脚本里紧随该命令行之后的内容将作为该命令的输入直到遇到结束符。这样我们就可以在脚本中动态的输出一些内容。方便以后查看。

※关于“>”、“>>”、“<”、“<<”等重定向命令更多的介绍,请查阅bash手册。

由于本人才疏学浅,如若发现存疑之处,还望各位悉心指出以便纠正。

posted on 2012-06-02 18:04  黑蝙蝠  阅读(7237)  评论(0编辑  收藏  举报

导航