找不到exec(因为文件描述符)

3

以下是我的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时,它可以正常运行!


你想要执行什么?- 你期望得到什么? - John3136
@John3136:exec 内置函数提供了一种将输入和输出重定向到文件描述符的机制。 - Adam Liss
Adam,我知道 - 我甚至知道如何使用它;-) 我只是认为OP应该更清楚地说明他们想要做什么。 - John3136
@John3136: 你有什么想法吗?顺便问一下,OP是什么意思? - kaiwii ho
OP是“原帖发布者”的缩写,由一些人(比如我)使用,因为他们懒得往上滚动查找提问者的用户名;-) - John3136
2个回答

1
这是因为您正在使用/bin/sh脚本运行,它可能链接到dash或其他最小的shell解释器。XCU 2.7重定向说:

打开的文件用以零开始的十进制数表示。最大可能值是实现定义的;但是,所有实现必须至少支持0到9(包括9)供应用程序使用。

因此,一些实现仅支持最多9个fd。
如果您想使用更多,请使用完整功能的shell,例如bash,将/bin/sh更改为/bin/bash

0
http://www.gnu.org/software/bash/manual/bashref.html#Redirections的GNU bash手册中:

使用大于9的文件描述符进行重定向时应该小心,因为它们可能会与shell内部使用的文件描述符冲突。


通常,只有前3个描述符由系统分配:

  • 0 = stdin,通常是从终端输入
  • 1 = stdout,通常输出到终端
  • 2 = stderr,也通常输出到终端,但保留用于错误消息,以防它们意外地通过管道发送。

您可以自由使用更高的数字。


那么你的意思是因为冲突的缘故?我和你的想法一样。但是,你能告诉我如何假装这种冲突吗?我的意思是,如何检查冲突?谢谢。 - kaiwii ho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接