linux shell命令之标准输入,标准输出,错误之重定向
下面是一个修改标准输入的例子
cat execin.sh
#!/bin/bash
#FD 8是FD(标准输入)的副本,用于恢复FD 0
exec 8<&0
exec < hfile #将标准输入重定向到hfile
read a #读取hfile文件的第1行
read b #读取hfile文件的第2行
echo "----------------------"
echo $a
echo $b
echo "Close FD 8:"
# 0<&8: 将FD 8复制到FD 0, FD 8是原来的标准输入,FD 0从FD 8中恢复原状
#8<&-: 关闭FD 8, 其它进程也可以重复使用FD 8
exec 0<&8 8<&-
#在执行read命令时,read命令从键盘输入读取数据
echo -n "Pls. Enter Data:"
read c #标准输入恢复成键盘输入
echo $c
./execin.sh
----------------------
Google also develops GFS and MapReduce
Hadoop is developed by Yahoo
Close FD 8: #将FD 8复制给FD 0,使FD 0恢复从键盘输入,再关闭FD 8
Pls. Enter Data:CAICAI
CAICAI
下面是一个修改标准输出的例子
cat execout.sh
#!/bin/bash
#FD 8是FD 1(即标准输出)的副本,用于恢复FD 1
exec 8>&1 #符号与execin.out中略有不同
exec >loggg #将标准备输出重定向到loggg
#执行date和df命令,测试输出是否写入loggg文件
echo "Output of date command"
date
echo "Output of df command"
df
# 1<&8: 将FD 8复制到FD 1, FD8是原来的标输出, FD 1从FD 8中恢复原状
exec 1<&8 8>&-
#再次执行date和df命令,测试标准输出是否恢复原状
echo "Output of date command"
date
echo "Output of df command"
df
./execout.sh
Output of date command
Wed Mar 31 20:20:27 PDT 2021
Output of df command
Filesystem 1K-blocks Used Available Use% Mounted on
udev 461560 0 461560 0% /dev
tmpfs 98532 7212 91320 8% /run
/dev/sda1 253769348 85649904 155205696 36% /
tmpfs 492656 216 492440 1% /dev/shm
tmpfs 5120 4 5116 1% /run/lock
tmpfs 492656 0 492656 0% /sys/fs/cgroup
tmpfs 98532 68 98464 1% /run/user/1000
cat loggg
Output of date command
Wed Mar 31 20:20:27 PDT 2021
Output of df command
Filesystem 1K-blocks Used Available Use% Mounted on
udev 461560 0 461560 0% /dev
tmpfs 98532 7212 91320 8% /run
/dev/sda1 253769348 85649904 155205696 36% /
tmpfs 492656 216 492440 1% /dev/shm
tmpfs 5120 4 5116 1% /run/lock
tmpfs 492656 0 492656 0% /sys/fs/cgroup
tmpfs 98532 68 98464 1% /run/user/1000
高级I/O重定向符号及其意义
n>&m 将FD为m的输出复制到FD为n的文件
n<&m 将FD为m的输入复制到FD为n的文件
n>&- 关闭FD为n的输出
n<&- 关闭FD为n的输入
&>file 将标准输出和标准错误输出重定向到文件
标准输出及标准的错误输出的例子
vi execerr.sh
#!/bin/bash
#将FD 1(即标准输出)复制到FD 8, FD 2(即标准错误输出)复制到FD 9
exec 8>&1 9>&2
#将标准输出和标准错误输出重定向到loggg文件
exec &> loggg
#执行ls z*和date命令,测试输出和错误输出是否写入loggg文件
ls z* #出现错误输出
date
#恢复标准输出和标准错误输出,并闭关FD 8和FD 9
exec 1>&8 2>&9 8<&- 9<&-
#再次执行ls Z* 和date命令,测试输出和错误输出是否恢复原状
echo "------------------"
echo "Close FD 8 and 9:"
ls z*
date
执行 ./execerr.sh
------------------
Close FD 8 and 9:
ls: cannot access 'z*': No such file or directory
Wed Mar 31 22:05:32 PDT 2021
cat loggg
ls: cannot access 'z*': No such file or directory
Wed Mar 31 22:05:32 PDT 2021
/dev/null:这是一个空设备文件,被送到其中的所有数据都会被全部丢弃,可以将标准输出和错误输出
全部重定向到该文件中,此时即可将错误信息全部丢弃。其标准写法是>/dev/null 2>&1, 其中,>dev/null
表示丢弃文件; 2>&1的2和1分别表示标准输出stdout和标准出错stderr, >&表示等同于,也就是将标准错输出
2重定向于标准输出1,由于标准输出已经被重定位到了/dev/null, 所以标准出错的输出也被扔掉了,写
法也可以是1>/dev/null 2>/dev/null,区别是这种情况下标准输出和标准出错都被送到/dev/null, 这个文件被
打开了两次,而>/dev/null 2>&1则是将标准输出送到/dev/null,标准出错则是从管道送到/dev/null,/dev/null
只是被打开了一次
/dev/tty: 当该文件被打开的时候,Shell会将自动重定向到一个终端(包括显示控制台,远程登录伪中断或者串口)
浙公网安备 33010602011771号