10.shell重定向

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容