前言
编写shell脚本程序时,总会使用重定向技术,用来永久保存程序的输出到文件中,或者用来从文件中提取文本到程序中,都支持哪些重定向呢?
温习3个文件描述符
1、标准输入,标准规定通常是键盘,数字0代表标准输入
2、标准输出,标准规定通常是屏幕,数字1代表标准输出
3、标准错误,标准规定通常是屏幕,数字2代表标准错误
为什么是数字0、1、2,且对应了标准输入、标准输出、标准错误呢?因为这是人为规定好的标准,你遵守它们制定好的标准即可,重定向操作与它们直接相关,现在你只需指导
标准输入重定向
根据标准,标准输入代表键盘,很多命令支持标准输入,比如grep、cat、wc,通常情况下支持从文件中读取内容的程序,往往支持标准输入。
回顾标准输入的使用
使用grep命令演示标准输入的显示,传递给它的参数hello表示正则表达式,接着我使用键盘输入hello world,grep命令会在匹配成功的情况下在标准输出中展示匹配的内容,所以你看到了两行hello world,此时的grep命令会一直处于标准输入的状态下,等待你从键盘输入内容,要想终止需要按下 Ctrl + D,代表标准输入结束,平常我们可以使用这种方式测试为grep传入的正则表达式是否可行,测试起来非常方便,这也算是个小技巧。
1、普通重定向
首先新建一个用于测试的文件,内容只有hello world
接着我们首次标准输入的重定向,此时的文件内容相当于代表键盘,语法则是使用小于号
此时输出的hello world则是grep在匹配后向标准输出展示的内容,同时grep程序也会自动结束,你可能想到我们在正常使用标准输入的时候,还需要手动输入Ctrl + D,才能让grep程序结束,而在使用标准输入重定向技术时,这个Ctrl + D,bash会为你自动加上,所以grep直接结束了
2、特殊的内联重定向
wc命令用于统计文件中的行数、单词数、字符数,此时我传入-l参数,表示只统计行数,它也支持标准输入的重定向,此处使用的特殊的内联重定向
语法规则:一定要有两个小于号开头,后面紧跟着的EOF单词代表开始与结束,当然你可以使用其他任意单词代替,两个EOF单词之间的内容会作为标准输入的内容传递给命令,代表结束的EOF单词,不要在它的旁边加任何空白字符
当你输入完结束单词后,Ctrl + D也会被自动输入,所以命令也会自动结束
标准输出的重定向
1、覆盖文件的标准输出重定向
使用单个大于号,后面跟着是文件名,文件不存在会创建,存在则会覆盖
echo hello world > test.txt
2、追加文件内容的标准输出重定向
内容会被追加到文件中,文件不存在会创建
echo baby >> test.txt
标准错误的重定向
1、覆盖文件
大于号>前面那个2,代表的就是标准错误,2是标准错误在进程上的文件描述符号
./test.sh 2> error.log
2、追加文件内容
两个大于号,>>,表示追加内容
./test.sh 2>> error.log
同时将标准输出与标准错误重定向到文件中
1、使用&>
./test.sh &> output.log
2、使用2>&1,注意这个要放在后面,2代表标准错误、1代表标准输出
echo hello > fuc.text 2>&1
3、如果是追加内容到文件中,使用>>即可
./test.sh &>> output.log
或者
echo hello >> fuc.txt 2>&1
即向屏幕中输出、也在文件中记录
我们要使用tee命令,它能帮我们办到,感谢chatgpt帮忙,牛13!!!
1. 将标准输出重定向到文件中,并在屏幕上显示输出: ``` ls -l | tee output.txt ```
2. 将标准输出和标准错误输出都重定向到文件中,并在屏幕上显示输出: ``` ls -l 2>&1 | tee output.txt ```
3. 将标准输出重定向到文件中,并在屏幕上显示输出,同时追加输出到另一个文件中: ``` ls -l | tee output.txt | tee -a output2.txt ```
命令其实根本不知道重定向技术,都是bash搞得鬼
echo hello > test.txt
echo命令只是向标准输出中打印hello,它不知道重定向到了某个文件中,这是bash来做的,所有命令都是这样的,命令只认识标准输入、标准输出、标准错误,至于bash在背后做了什么,它们一概不知。