shell中将输入、输出和错误用三种描述符表示:
- 标准输入
STDIN
,用0表示,接受键盘输入
使用cat
命令接受键盘输入 - 非标准输入-文件输入,即使用
cat
读取文件 - 标准输出
STDOUT
,对应终端显示,1表示 - 标准错误
STDERR
,2表示
🎈Demo1:重定向输出到文件中
ls -l
显示文件的信息
>>
追加内容
>
替换内容
who
命令打印当前登录的系统用户信息
ls -l hello.sh
cat hello.sh
#追加内容
who>>hello.sh
cat hello.sh
🎈Demo2:重定向错误信息输出到文件中
-al
查找文件
❌错误做法:
ls -al hello.sh > aim.sh
上面执行后,如果没有aim.sh
文件,则会自动创建aim.sh文件,但是最终都不会将错误信息输出到目标文件aim.sh
中
所以如果我们需要保存错误信息,就需要采用STDERR
实现
✅正确做法:
将STDERR文件描述修改为2
ls -al a.sh 2>hello.sh
🎈Demo3:同时保存错误和数据到不同文件
#将错误数据重定向到error.sh文件中,将查找结果保存到hello.sh文件中
ls -al a.sh b.sh c.sh 2>error.sh >hello.sh
🎈Demo4:同时保存错误和数据到同一个文件
使用命令符&>
ls -a file.sh &>result.sh
#查看文件内容
cat result.sh
临时重定向输出:
&
命令
#将输出信息作为错位日志
echo "haha" >& 2
执行:将STDERR信息重定向到error.sh文件中
./hello.sh 2>error.sh
永久重定向输出:
exec
命令
保存数据:
#在文件内部
exec 1 > new.sh
echo "haha"
重定向输入:
命令符<
一旦设置了输入重定向指令,则read
指令会自动连接输入的内容
#从hello.sh文件中读取数据
exec 0< hello.sh
count=0
while read line
do
echo "当前行的内容数据是:$line,当前行数:$count"
count=$[$count + 1]
done
自定义重定向输出:
使用exec
命令
🎈下面这种方式,会替换掉要定向文件里面的所有内容:
exec 3> hello.sh
#临时重定向,标记文件
echo "haha" >&3
🎈如果在要定向的文件中追加内容,而不是替换:
exec 3 >> hello.sh
#临时重定向,标记文件
echo "haha" >&3
重定向输出恢复:
#将3重定向为1
exec 3 >& 1
exec 1> hello.sh
echo "haha"
#将1恢复到3
exec 1 >& 3
echo "xixi"
创建读写文件描述符:
exec 3<>hello.sh
#从hello文件中读取内容
read line >&3
echo "$line"
#写入内容
echo "hah" >& 3
#注意:此写入会替换掉从第二行开始的所有内容
#因为上面读取完第一行后,此时文件指针指向到了第二行
关闭读写文件描述符:
exec 3 >&-
阻止命令输出:
输出到系统一个临时文件中,但是此临时文件不会保存内容
ls -al > /dev/null
使用阻止输出来清空文件:
cat /dev/null > hello.sh
网友评论