12.1 了解输入和输出
12.1.1 标准文件描述符
linux 使用文件描述符,标识每个文件对象
STDOUT 和 STDERR
STDERR 时shell 发送 错误消息的 目的地,默认情况下 STDERR 和 STDOUT文件描述符
指向相同的位置,即显示器。重定向 STDOUT 不会自动重定向 STDERR
12.1.2 重定向错误
ls -al badfile 2> test4 文件重定向符必须位于 > 前
ls -al test1 test2 test3 2>test5 (文件test1 test2 存在)屏幕会显示1 ,2 信息 ,test3的错误信息
会重定向到test5
2. 重定向错误和数据
如果需要重定向 错误 和 输出, 需要两个 文件重定向符
ls -al test1 test2 test3 2>test5 1>test6
1> 重定向 STDOUT
2> 重定向STDERR
也可以将 STDOUT 和 STDERR 重定向 到一个文件 (&)
ls -al test1 test2 test3 &> test5
12.2 在脚本中重定向输出
12.2.1 临时重定向
如果想故意在脚本中生成错误消息,可以将单个输出行重定向到 STDERR ,需要做的只是使用
输出重定向 符号,将 输出 重定向到 STDERR文件描述,还必须在文件描述符前面添加&
echo "this is a error message" > &2
该行在脚本的STDERR指向的地方,而不是STDOUT指向的地方显示。
12.2.2 永久重定向
exec命令通知shell 在脚本执行期间重定向特定的文件描述
exec 2>testerror
echo "这条语句不会重定向 到testfile "
exec 1> testfile
echo "this is a test of 会重定向"
echo "this is a two 会重定向"
echo "this is a three 会重定向"
exec 启动一个新shell ,并将STDOUT 文件描述符重定向到一个文件,
12.3 在脚本中重定向输入
exec 0 < testfile 应该 从文件 testfile 而不是 STDIN 获取输入
count=1
while read line
do
echo "line #$count : $line"
count=$[ count +1 ]
done
12.4 创建自己的重定向
12.4.1 创建输出文件描述符
exec 3>test13out (文件描述符3 的文件位置 重定向到 test3out )
echo "this should display on the monitor"
echo "and this should be stored in file " >&3 (该条信息 保存到 test13out )
echo " then this should be back on the monitor "
12.4.2 重定向文件描述符
exec 3>&1 (文件描述符3重定向到文件描述符1的当前位置,即3对应标准输出)
exec 1>test13out (将文件描述符1的当前位置 重定向到 文件 test13out )
echo "this should be stored in the output file "
exec 1>&3 (将文件描述符1的当前位置重定向到3 对应的当前位置,即标准输出)
echo "this should be back to normal"
12.4.3 创建输入文件描述符
在重定向到文件之前,将 STDIN文件描述符位置保存到另一个文件描述符,然后在完成了文件读取
操作之后,可以将STDIN 恢复为原来的位置
exec 6 <&0 ( STDIN文件描述符位置保存到另一个文件描述符)
exec 0<testfile
count=1
while read line
do
echo "Line #$count : $line "
count=$[count+1]
done
exec 0<&6
read -p "done ?" answer
case $answer in
Y|y) echo "goodbye" ;;
N|n) echo "sorry,this is the end ";;
esac
12.4.4 创建读取 和写入文件描述符
输入和输出可以同时打开同一个文件描述符,可以同时使用同一个文件描述符,从
一个文件读取数据 和 写入 数据 。
读取 、写入时 shell 维护一个内部指针,指示文件内部位置,读取和写入都发生在指针
上次放置的位置,
exec 3<>testfile
read line <&3 (从文件描述符3 当前位置,读取一行 )内部指针处于第二行的第一个字符
echo "read line: $line "
echo "this is a test line ">&3 (从左道右,依次覆盖第二行内容,根据输入 字符长度 覆盖 )
12.4.5 关闭文件描述符
创建的新的文件描述符,在shell 关闭时,会自动关闭,如需手动关闭,可以将他重定向到特殊符号 &-
exec 3> testfile
echo "this is input">&3
exec 3>&- (手动关闭 文件描述符)
12.5列出开放文件描述
使用 lsof 命令可以跟踪 文件描述符定位到哪个位置
-p 参数 可以指定进程 ID
-d 参数 可以指定要显示的文件描述符
-a 选项可以用来连接其他两个选项的结果
特殊环境 变量 $$ 代表当前进程 ID
PS /dev/pts/0 代表 标准输入终端
12.6 禁止命令输出
/dev/null 定位到该位置的数据都将丢失 且 不会保存,
ls -al >/dev/null
12.7 创建临时文件
12.7.1 创建本地临时文件
默认情况下,mktemp 在本地目录创建临时文件,文件名 (文本文件名+6个X)
mktemp 命令使用 一个6个字符 代替 6个X ,以确保文件名在字符中唯一,
tempfile=`mktemp test19.XXXXXX`
exec 3>$tempfile
echo "this scripts write to temp file $tempfile"
echo "congdingxiang ">&3
echo "done the temp file conents is :"
cat $tempfile
rm -f $tempfile 2>/dev/null
12.7.2 在/temp中创建临时文件
-t 命令 强制 mktemp 命令,在 /temp 中创建临时文件
mktemp 返回文件的 完整路径
12.7.3 创建临时目录
-d 选项让 mktemp 命令创建一个 临时目录 ,而不是临时文件
12.8 记录消息
如将消息同时发送到监视器 和 日志文件,需要 tee 命令,他讲STDIN的数据同时发送到
STDOUT 和 tee 命令指定的文件