EKsumic's Blog

let today = new Beginning();

Click the left button to use the catalog.

OR

Linux新手入门第四天——cat指令与输入输出重定向

好的,昨天的学到了

cat /etc/passwd

这个是用来查看passwd包含哪些内容的,

 

Q:cat是什么,passwd又是什么?

cat是Concatenate的缩写,意思是link (things) together in a chain or series.

可以说是非常形象了,因为cat 命令用于连接文件并打印到标准输出设备上。

简而言之,就是查看文件内容。(以List的形式)

 

Linux 系统中的 /etc/passwd 文件,是系统用户配置文件,存储了系统中所有用户的基本信息,并且所有用户都可以对此文件执行读操作。

 

谈到 /etc/passwd,有的资料写的是

vi /etc/passwd和vim /etc/passwd,

Sample

Q:vi和cat有什么区别呢?

A:cat仅查看,vi是查看和编辑。

 

Q:vi和vim有什么区别呢?

A:vim是 vi的增强版,完全兼容vi。

 

继续研究cat指令,因为cat是Concatenate的缩写,link (things) together in a chain or series.(将东西连在一起放在一个链表或系列中)

 

Q:cat指令为什么不使用list作为指令?

A:因为cat不仅仅是查看,还能连接多个文件的内容。

 

比如:

cat -b textfile1 textfile2 >> textfile3

表示把 textfile1 和 textfile2 的文档内容加上行号(空白行不加)之后将内容附加到 textfile3 文档里。

这,就解释了那段英文的意思。

 

cat不仅仅是查看,它在默认情况下,最简单的用法是查看。

cat相当于输出,合并文件内容并输出到其它文件。

 

补充关于cat的实例:

catcat -n textfile1 > textfile2

把 textfile1 的文档内容加上行号后输入 textfile2 这个文档里。

 

这么一来,引出了新的内容。

Q:-n是什么?

A:-n或—number,由1开始对所有输出的行数编号。

使用例:

Sample

Sample

Q:-b是什么?

A:-b或—number-nonblank,和-n相似,只不过对于空白行不编号。

使用例:

Sample

Sample

Q:-和—的区别?

A:-加字母是简写,--加单词是全称,效果一样。

 

Q:>和>>的区别?

A:>会覆盖目标的原有内容,>>会在目标原有内容后追加内容。

 

Q:>和>>的相同点?

A:如果目标文件不存在的话,将直接创建文件。

>>和>都属于输出重定向。

 

Q:既然由输出重定向,那有输入重定向吗?

A:有。

 

Q:什么是输入重定向?

A:<属于输入重定向。

Description:

在解释输入重定向之前,先了解什么叫重定向?

首先,先了解什么是标准输入和标准输出:

linux标准输入设备指的是键盘,标准输出设备指的是显示器,标准错误输出指的是显示器。

 

 

设备 设备名 文件描述符 类型
键盘  /dev/stdin 0 标准输入
显示器 /dev/stdout 1 标准输出
显示器  /dev/stderr 2 标准错误输出

注:std指standard的缩写。

 

 

Q:什么是文件描述符。

A:简而言之,文件描述符暂时先理解为一个tag吧。(但是已经基本能看出来Linux自举的痕迹,因为文件描述符这种东西是可以自定义的,这就意味着你可以有「不标准输入」和「不标准输出」,而「不标准输入输出」和「标准」是同级的)

 

cat命令会接受默认标准输入设备键盘的输入,但是可以通过“<”符号修改标准输入设备,「指定文件」作为标准输入设备。

 

注意:当你理解了“>”的时候,不要尝试按照符号指向去理解含义。(比如,“>”可以将内容输出到一个文件,从左到右,“<”你直接理解成也是输出,从右到左,是错误的)

 

“<”表示接管你的标准输入,

 

实例 1:

cat < /etc/passwd 

它是将passwd文件指定为输入设备,并将内容显示到控制台。

Q:它和cat /etc/passwd 有什么 区别?

A:没有区别。(因为你的标准输出就是控制台)

Sample

Sample

具体原因请看→这里

 

实例2:

cat << delimiter

delimiter没有任何意义,随便写的。

这一句的内容是将delimiter的document作为输入传递给cat,碰到delimiter将自动结束输入,并将输入的内容显示出来。

就像这样,

Sample

你可以输入一些乱七八槽的东西,最后Ctrl+C退出。

Ctrl+C是强制中止,因为我实在不知道怎么退出,猜不出来,就直接中断了。

……

好吧,后来知道是怎么回事了,<<表示指定分隔符退出:

Sample

当我输入cat << fuck的时候,

我进入了可编辑状态,当编辑状态遇到fuck这个单词的时候,你会退出该状态,并将内容按行重新输出到terminal。

 

实例3:

cat < test.txt >new.txt

这是我看不懂的东西,我不明白它和

cat text.txt>new.txt

有什么区别。

不过这个还行,我可以理解为text.txt代替标准输入,输出到了 new.txt。

 

实例4:

cat  /etc/passwd  < a.txt  > b.txt

这个我真的看不懂了,

将a代替标准输入,输出到/etc/passwd?

我觉得不可能,但凡有点常识是不会去动系统文件的。

 

那这是什么意思呢?

将文件passwd输入重定向到a,输出重定向到b.txt文件。

这个指令,

cat  /etc/passwd < a.txt > b.txt

重新看一下,不要把/etc/passwd < a.txt 看成整体,要把< a.txt > b.txt看成整体,理解为

1 查看/etc/passwd
2 我不要在terminal中显示,我要重定向输入到< a.txt

3 好的,现在把a.txt里的内容重定向输出到b.txt吧

 

Sample

你会发现a.txt里面没有内容,b.txt里面才有。

 

实际上:

cat < /etc/passwd > b.txt

Sample

可以一样将b.txt得到/etc/passwd的内容 。

 

而这么一来,

cat /etc/passwd < a.txt > b.txt

的正确理解应该是

cat < /etc/passwd < a.txt > b.txt

执行顺序从左向右。(不对,这个命令应该不合法)

Sample

实际测试,命令并没有报错,但是b文件和a文件都没有内容。(不知道为什么,先不深究)

 

另外,尝试过cat a.txt<b.txt,

Sample

同样没有抛出异常,a文件和b文件也没有内容。

 

思考题:

Sample

已知a.txt为 null,b.txt内容为test,请问:

cat b.txt

cat <b.txt

cat a.txt<b.txt

cat <a.txt<b.txt

这4种指令有什么区别?

 

 

【目录】Linux新手入门——从理论到实战

 

参考文档:

[1] Linux /etc/passwd

[2] linux 输入、输出重定向的概念和用法详解(Day01)

This article was last edited at 2023-04-21 22:42:24

* *