20.1 使用 exec
一个 exec < filename 命令重定向了 标准输入 到一个文件。自此所有 标准输入 都来自该文件而不是默认来源(通常是键盘输入)。在使用 sed 和 awk 时候这种方式可以逐行读文件并逐行解析。
样例 20-1. 使用 exec 重定向 标准输入
#!/bin/bash
# 使用 'exec' 重定向 标准输入 .
exec 6<&0 # 链接文件描述符 #6 到标准输入.
# .
exec < data-file # 标准输入被文件 "data-file" 替换
read a1 # 读取文件 "data-file" 首行.
read a2 # 读取文件 "data-file" 第二行
echo
echo "Following lines read from file."
echo "-------------------------------"
echo $a1
echo $a2
echo; echo; echo
exec 0<&6 6<&-
# 现在在之前保存的位置将从文件描述符 #6 将 标准输出 恢复.
#+ 且关闭文件描述符 #6 ( 6<&- ) 让其他程序正常使用.
#
# <&6 6<&- also works.
echo -n "Enter data "
read b1 # 现在按预期的,从正常的标准输入 "read".
echo "Input read from stdin."
echo "----------------------"
echo "b1 = $b1"
echo
exit 0同理, exec >filename 重定向 标准输出 到指定文件. 他将所有的命令输出通常是 标准输出 重定向到指定的位置.
exec N > filename 影响整个脚本或当前 shell。PID 从重定向脚本或 shell 的那时候已经发生了改变. 然而 N > filename 影响的就是新派生的进程,而不是整个脚本或 shell。
样例 20-2. 使用 exec 重定向标准输出
样例 20-3. 用 exec 在一个脚本里同时重定向 标准输入 和 标准输出
I/O 重定向是种明智的规避 inaccessible variables within a subshell 问题的方法.
样例 20-4. 规避子 shell
Last updated
Was this helpful?