bash手册 之重定向原理与实现

Posted zengkefu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bash手册 之重定向原理与实现相关的知识,希望对你有一定的参考价值。

http://www.gnu.org/software/bash/manual/bashref.html#Redirections

http://www.cnblogs.com/weidagang2046/p/io-redirection.html 原理与实现

http://blog.csdn.net/taiyang1987912/article/details/39401265

[root@server1 tmp]# cd /dev/fd
[root@server1 fd]# ll
总用量 0
lrwx------ 1 root root 64 6月 4 12:17 0 -> /dev/pts/0
lrwx------ 1 root root 64 6月 4 12:17 1 -> /dev/pts/0
lrwx------ 1 root root 64 6月 4 12:17 2 -> /dev/pts/0
lrwx------ 1 root root 64 6月 4 12:17 255 -> /dev/pts/0

 

#使用exec将stdin重定向到文件
#!/bin/bash

exec 8<&0           #FD 8是FD 0的副本,用于恢复标准输入
exec < file         #将标准输入重定向到file
read a              #读取file的第一行
read b              #读取file的第二行
echo "read has read $$"
echo "read has read $PPID"
sleep 100
echo "----------------"
echo $a             #标准输出
echo $b             #标准输出

该进程的文件描述符FD 变为如下

[root@server1 fd]# ll
总用量 0
lr-x------ 1 root root 64 6月 4 13:03 0 -> /root/file
lrwx------ 1 root root 64 6月 4 13:03 1 -> /dev/pts/0
lrwx------ 1 root root 64 6月 4 13:03 2 -> /dev/pts/0
lr-x------ 1 root root 64 6月 4 13:03 254 -> /root/a.sh
lrwx------ 1 root root 64 6月 4 13:03 255 -> /dev/pts/0
lrwx------ 1 root root 64 6月 4 13:03 8 -> /dev/pts/0

 

 

echo "close FD 8:"
exec 0<&8 8<&- #将FD 8复制到FD 0,恢复FD 0,并关闭FD 8,其他进程可以重复使用FD 8
echo -n "Enter Data:"
read c #read从标准输入读取数据
echo $c
echo $$
echo $PPID
sleep 100

 

[root@server1 4598]# ll fd
总用量 0
lrwx------ 1 root root 64 6月 4 13:11 0 -> /dev/pts/0
lrwx------ 1 root root 64 6月 4 13:11 1 -> /dev/pts/0
lrwx------ 1 root root 64 6月 4 13:11 2 -> /dev/pts/0
lr-x------ 1 root root 64 6月 4 13:11 254 -> /root/a.sh
lrwx------ 1 root root 64 6月 4 13:11 255 -> /dev/pts/0

 

 

#eval重新提交shell
#!/bin/bash

while read NAME VALUE     #第一列作为变量名,第二列作为变量值        //对应文件中的两列
do
eval "${NAME}=${VALUE}"   #第1轮变量替换,eval重新提交shell完成赋值操作     
done < evalsource         #输入重定向
echo "var1=$var1"         #变量赋值
echo "var2=$var2"

eval "${NAME}=${VALUE}" 为一段可执行的命令,而不是字符串

 

[root@server1 ~]# eval "cc=100"
[root@server1 ~]# echo $cc
100


[root@server1 ~]# echo "dd=100"
dd=100



 


[root@server1 ~]# x=100
[root@server1 ~]# ptrx=x
[root@server1 ~]# eval echo \\$$ptrx
100
[root@server1 ~]# eval $ptrx=50
[root@server1 ~]# echo $x
50
[root@server1 ~]# echo $ptrx
x

 

以上是关于bash手册 之重定向原理与实现的主要内容,如果未能解决你的问题,请参考以下文章

angular---路由之重定向路由

linux下的IO重定向与管道相关的知识简析

测开之路四十八:Django之重定向与cookie

#yyds干货盘点#Linux之重定向

Flask路由之重定向

linux综合顺练(涉及管道,正则,重定向用户及组管理权限管理等相关知识点)