这是我的shell脚本:
#!/bin/sh
exec 100>&1
exec 1>hello.txt
echo "hello exec"
echo "hello world"
exec 1>&100 100>&-
但当我运行它时,系统会提示:
exec: 2: 100: not found
当我使用命令lsof
检查其文件描述符的信息时,它会提示:
lsof -p 31931 -d 100
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dbus-daem 1230 kaiwii 100u unix 0x00000000 0t0 3753938 socket
bash 31931 kaiwii cwd DIR 8,7 4096 6316395 /home/kaiwii/test
bash 31931 kaiwii rtd DIR 8,7 4096 2 /
bash 31931 kaiwii txt REG 8,7 822420 8208388 /bin/bash
bash 31931 kaiwii mem REG 8,7 1434180 1688385 /lib/i386-linux-gnu/libc-2.13.so
bash 31931 kaiwii mem REG 8,7 38500 1688435 /lib/i386-linux-gnu/libnss_nis-2.13.so
bash 31931 kaiwii mem REG 8,7 79672 1688425 /lib/i386-linux-gnu/libnsl-2.13.so
bash 31931 kaiwii mem REG 8,7 26400 1688427 /lib/i386-linux-gnu/libnss_compat-2.13.so
bash 31931 kaiwii mem REG 8,7 117960 1688372 /lib/i386-linux-gnu/ld-2.13.so
bash 31931 kaiwii mem REG 8,7 9736 1688395 /lib/i386-linux-gnu/libdl-2.13.so
bash 31931 kaiwii mem REG 8,7 223468 1687611 /lib/libncurses.so.5.7
bash 31931 kaiwii mem REG 8,7 42580 1688431 /lib/i386-linux-gnu/libnss_files-2.13.so
bash 31931 kaiwii mem REG 8,7 123384 5685786 /usr/share/locale-langpack/zh_CN/LC_MESSAGES/bash.mo
bash 31931 kaiwii mem REG 8,7 8322432 319489 /usr/lib/locale/locale-archive
bash 31931 kaiwii 0r CHR 136,0 0t0 3 /dev/pts/0
bash 31931 kaiwii 1u CHR 136,0 0t0 3 /dev/pts/0
bash 31931 kaiwii 2u CHR 136,0 0t0 3 /dev/pts/0
bash 31931 kaiwii 255u CHR 136,0 0t0 3 /dev/pts/0
由于我不熟悉命令exec
,尤其是不熟悉如何修改文件描述符,我不知道发生了什么!顺便说一下,当我将文件描述符100更改为8时,它运行正常!
这是因为您使用/bin/sh
运行脚本,该脚本可能链接到dash
或其他最小shell解释器。XCU 2.7重定向说:
打开的文件由以零开头的十进制数字表示。这个最大可能的值是定义的实现;然而,所有实现应至少支持0到9(包括0到9),以供应用程序。
因此,其中一些实现最多支持9 fd。
如果您想使用更多,请使用像bash
这样的全功能shell,将/bin/sh
更改为/bin/bash
来自GNU bash手册http://www.gnu.org/software/bash/manual/bashref.html#Redirections:
使用大于9的文件描述符的重定向应该小心使用,因为它们可能与shell内部使用的文件描述符冲突。
通常,系统只分配前3个描述符:
- 0=
stdin
,通常从终端输入 - 1=
stdout
,通常输出到端子 - 2=
stderr
,通常也输出到终端,但保留用于错误消息,这样它们就不会意外地通过管道发送
您可以自由使用较高的数字。