注:该文章例子来自于网络的收集和整理,附带本人注解。
1):run.sh脚本使用exec将stdin(标准输入)重定向到文件
root@37C:~# cat run.sh #!/bin/bash exec 8<&0 # 标准输入默认是指向了键盘,复制一份到 8 中,8 也指向了键盘。 exec 0< hfile # 1. 使用标准输入打开文件hfile。 read a # 2. read 将从stdin中读取命令。 read b echo "---------------------------" echo $a echo $b echo "Close FD 8:" exec 0<&8 8<&- #将FD-8 copy到标准输入(恢复指向键盘),否则,标准输入还是指向hfile。 echo -n "Pls. Enter Data: " #这里,标准输入重新指向了键盘。 read c #需要我们手工键入字符。 echo $c exit 0 123456789101112131415结果输出:
# hfile文件的内容。 root@37C:~# cat hfile value1 value2 root@37C:~# ./run.sh --------------------------- value1 value2 Close FD 8: Pls. Enter Data: value3 value3 root@37C:~# 12345678910111213142):run.sh脚本将stdout重定向到文件
root@37C:~# cat run.sh #!/bin/bash exec 8>&1 # 打开 FD-8,并使它指向显示器。 exec 1> log # 将标准输出指向log文件 echo '------redirect to log file-------' # 这部分输出会保存在log文件里面。 echo "Output of date command:" date echo "Output of df command:" df sleep 5s # 先睡 5 秒,以区分两个结果输出。 exec 1>&8 8>&- echo "------termincal display:-------" echo "Output of date command" date echo "Output of df command" df 1234567891011121314151617结果输出:
root@37C:~# ./run.sh ------termincal display:------- Output of date command 2016年 09月 20日 星期二 16:02:08 CST Output of df command 文件系统 1K-块 已用 可用 已用% 挂载点 udev 355032 0 355032 0% /dev tmpfs 75824 3020 72804 4% /run /dev/sda1 17673004 6600160 10152064 40% / tmpfs 379108 132 378976 1% /dev/shm tmpfs 5120 4 5116 1% /run/lock tmpfs 379108 0 379108 0% /sys/fs/cgroup tmpfs 75824 48 75776 1% /run/user/1000 root@37C:~# cat log ------redirect to log file------- Output of date command: 2016年 09月 20日 星期二 16:02:03 CST Output of df command: 文件系统 1K-块 已用 可用 已用% 挂载点 udev 355032 0 355032 0% /dev tmpfs 75824 3020 72804 4% /run /dev/sda1 17673004 6600160 10152064 40% / tmpfs 379108 132 378976 1% /dev/shm tmpfs 5120 4 5116 1% /run/lock tmpfs 379108 0 379108 0% /sys/fs/cgroup tmpfs 75824 48 75776 1% /run/user/1000 root@37C:~# 1234567891011121314151617181920212223242526273):&>file将stdout和stderr重定向到文件
#!/bin/bash exec 8>&1 9>&2 #FD 1复制到FD 8,FD 2复制到FD 9 exec &> log #&>符号将stdout和stderr重定向到文件log ls z* #错误写入文件log date #输出写入文件log exec 1>&8 2>&9 8<&- 9<&- #恢复关闭操作 echo "-----------------" echo "Close FD 8 and 9:" ls z* date 12345678910114):普通例子
_1):使用文件描述符3以读取模式打开文件run.py
root@37C:~# exec 3<run.py root@37C:~# cat <&3 #!/usr/bin/python3 # -*- coding:utf-8 -*- import logging logging.basicConfig(level=logging.INFO) s = '0' n = int(s) logging.info('n = %d' % n) print(10 / n) root@37C:~# 123456789101112_2):使用文件描述符4以截断模式打开文件log
root@37C:~# exec 4>log root@37C:~# echo " I think befor I am" 1>&4 root@37C:~# cat log I think befor I am root@37C:~# 12345_3):使用文件描述符5以追加模式打开文件log
root@37C:~# exec 5>>log # 这里echo 使用'>'而非'>>'来进行追加。 root@37C:~# echo 'say again: I think before I am!' >&5 root@37C:~# cat log I think befor I am say again: I think before I am! 123456_4):exec 执行后的观察。
# FD 8,9也指向了FD 0,1所指向的文件。 root@37C:~# exec 9>&1 root@37C:~# exec 8<&0 root@37C:~# ls -l /proc/self/fd/ 总用量 0 lrwx------ 1 root root 64 9月 21 21:03 0 -> /dev/pts/2 lrwx------ 1 root root 64 9月 21 21:03 1 -> /dev/pts/2 lrwx------ 1 root root 64 9月 21 21:03 2 -> /dev/pts/2 lr-x------ 1 root root 64 9月 21 21:03 3 -> /proc/20455/fd lrwx------ 1 root root 64 9月 21 21:03 8 -> /dev/pts/2 lrwx------ 1 root root 64 9月 21 21:03 9 -> /dev/pts/2 1234567891011③ 尝试题
# 尝试一下的操作结果会如何? root@37C:~# exec 0<run.sh 12 <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-e9f16cbbc2.css" rel="stylesheet"> </div>