好的,昨天的学到了
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,
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开始对所有输出的行数编号。
使用例:
Q:-b是什么?
A:-b或—number-nonblank,和-n相似,只不过对于空白行不编号。
使用例:
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:没有区别。(因为你的标准输出就是控制台)
具体原因请看→这里。
实例2:
cat << delimiter
delimiter没有任何意义,随便写的。
这一句的内容是将delimiter的document作为输入传递给cat,碰到delimiter将自动结束输入,并将输入的内容显示出来。
就像这样,
你可以输入一些乱七八槽的东西,最后Ctrl+C退出。
Ctrl+C是强制中止,因为我实在不知道怎么退出,猜不出来,就直接中断了。
……
好吧,后来知道是怎么回事了,<<表示指定分隔符退出:
当我输入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.txt3 好的,现在把a.txt里的内容重定向输出到b.txt吧
你会发现a.txt里面没有内容,b.txt里面才有。
实际上:
cat < /etc/passwd > b.txt
可以一样将b.txt得到/etc/passwd的内容 。
而这么一来,
cat /etc/passwd < a.txt > b.txt
的正确理解应该是
cat < /etc/passwd < a.txt > b.txt
执行顺序从左向右。(不对,这个命令应该不合法)
实际测试,命令并没有报错,但是b文件和a文件都没有内容。(不知道为什么,先不深究)
另外,尝试过cat a.txt<b.txt,
同样没有抛出异常,a文件和b文件也没有内容。
思考题:
已知a.txt为 null,b.txt内容为test,请问:
cat b.txt
cat <b.txt
cat a.txt<b.txt
cat <a.txt<b.txt
这4种指令有什么区别?
参考文档:
Today's comments have reached the limit. If you want to comment, please wait until tomorrow (UTC-Time).
There is 19h06m17s left until you can comment.