写脚本代码的时候重定向是一个很重要的功能,比如打印日志什么的都需要用到。
大体来说: 重定向分为两种,一种叫临时重定向,一种叫长久重定向。
临时重定向就是每次在输出的时候都必须指定重定向:
echo good for u > log
这里实际上省略了一个1(标准输入),代表将标准输入转向到log中。
linux每个进程都有0, 1, 2 三个文件描述符。 重定向就是将这些文件描述符关联到相应的文件(设备), 比如默认的是0关联到标准输入,1关联到标准输出, 2关联到标准错误
如果你觉得你需要将他们关联到不同的地方那么就 进行重定向----实际上就是改变0,1,2 关联到的文件, 比如上面的例子, 1 默认关联的是标准输出,也就是显示器, 经过上面
的更改, 那么1 现在关联到了log文件之中。 我们echo 输出 总是输出到 文件描述符1 中的。 如果1 关联的是显示器就输入到显示器上, 1 关联的是log文件,那么就显示到log文件上
举个栗子:
0 ----- 键盘
1 ----- 显示器
2 ----- 显示器
重定向就是改变对应关系。经过上面的命令后,对应关系变成了这样。 注意程序中的输入输出都是操作的文件描述符(也就是0,1,2这些数字),这些数字关联什么设备就从对应的设备进行
操作,这点明白后就了解重定向了。
0 ----- 键盘
1 ----- log
2 ----- 显示器
临时重定向比较简单。 每次 指定就可以了。
下面说下exec命令。 这个就是 linux里面的永久重定向功能、
下面用一些例子说明:
首先需要介绍&,这个符号在重定向里面和后面的数字一起代表后面的数字表示的设备。
exec 1>&2
那么上面这句话的意思就是。 将 1 关联到了 2 对应的设备上。 也就是标准输出对应到标准错误输出上了, 由于都是显示器。 所以就没有区别了。
exec 2>log
上面这句话就是将标准错误输出写到log文件里面
exec 1>/dev/null 2>&1
上面的要注意。 将1对应到null文件上。 然后将2定位到1对应的文件上。 那么实际上1和2都指向null文件了。
注意千万不要反过来。
exec 2>&1 1>/dev/null
这个和上面不同的是:将2对应到1对应的设备上(现在1还未重定向,所以对应的是显示器), 那么2对应显示器,然后1对应null文件。
有时候需要重定向之后又恢复到以前的标准。所以需要一个临时的替代文件描述符
换句话说 你将 1对应到null文件之后 , 你又重新想定位到 显示器, 那么怎么找到这个显示器呢? 就得有个文件描述符来指向显示器。
比如
exec 6>&1 1代表的设备是显示器。 执行这句话后 6就是指向显示器了。
exec 1>log 然后1定向到log
输出一些东西
(在输出的时候如果需要输出到显示器, 可以采用&6来访问显示器)
exec 1>&6 然后1又恢复到显示器
exec 6>&- 这句话相当于删除掉临时的文件描述符
关键点: &符号的意思: 相当于指针一样, 和文件描述符一起代表设备
exec 的用法。多试试就OK 。