EXEC没有发现(因为文件描述符)
这里是我的shell脚本:EXEC没有发现(因为文件描述符)
#!/bin/sh
exec 100>&1
exec 1>hello.txt
echo "hello exec"
echo "hello world"
exec 1>&100 100>&-
但是当我运行它时,系统会提示:
当我使用命令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时,它运行正常!
从GNU bash的手册在http://www.gnu.org/software/bash/manual/bashref.html#Redirections:使用文件
重定向描述符大于9应小心使用,因为它们可能与文件发生冲突的描述符壳内部使用。
- 0 =
stdin
,通常是从一个终端- 1 =
stdout
输入,通常输出到终端:
一般来说,只有所述第一3个描述符由系统分配
stderr
,通常也输出到一个终端,但保留给错误消息,所以他们不会意外地发送管道。您可以自由使用更高的数字。
:所以你的意思是因为冲突?我分享你的同一个想法。但是,你会告诉我如何假装这样的冲突,我的意思是,如何检查冲突?thx – 2012-03-05 06:37:23
这是因为你正在运行脚本/bin/sh
这可能链接到dash
或其他最小的shell解释器。 XCU 2.7重定向说:
打开的文件由从零开始的十进制数表示。 最大的可能值是实现定义的;然而,所有 实现应支持至少0至9,包括 应用程序使用。
因此,其中一些实现支持最大9 fd。
如果你想使用更多,使用全功能的壳像bash
,改变/bin/sh
与/bin/bash
什么是你想给exec? - 你在期待什么? – John3136 2012-03-05 03:43:15
@ John3136:'exec'内置提供了一种将输入和输出重定向到文件描述符的机制。 – 2012-03-05 03:48:05
亚当,我知道 - 我甚至知道如何使用它;-)我只是觉得OP可能对他们正在尝试做的事更清楚一些。 – John3136 2012-03-05 03:53:21