我们可以拥有除通常的stdin / stdout / stderr(0,1,2)之外的更多文件描述符吗?

时间:2012-01-18 00:26:09

标签: bash shell unix

我们可以实际为文件描述符号分配任何文件吗?

3 个答案:

答案 0 :(得分:6)

是的,你可以。但是如果它对它有所帮助,那就取决于该程序。

$ cat fd.c 
int main()
{
    write(5,"test\n",5);
}
$ gcc fd.c
$ ./a.out 5> file
$ cat file
test
$ ./a.out 5>&1
test
$ ./a.out 
$ 

在最后一种情况下,fd 5的输出消失了。

openssl使用它来允许密码短语等传递给流程而不使用常规argv(可能会暴露它们)。

更新输入大小写:

$ cat fd_in.c 
int main()
{
    unsigned char buf[16];
    write(5,buf,read(6,buf,16));
}
$ gcc fd_in.c 
$ ./a.out 6< file 5>&1
test

file包含前一个示例中的test\n

答案 1 :(得分:3)

是的,在bash中,您可以使用file descriptor进行阅读和/或写作,并且可以使用任何数字。 ,因为 0 1 2 用于 STDIN STDOUT STDERR ,我们避免这些。此外,数字大于9 在内部使用,因此我们也倾向于避免这些。

这是我们打开文件描述符以执行以下操作的方法:

读取:

fd<source

写:

fd>source

读/写:

fd<>source

其中fd是一个描述file descriptorsource的数字,可以是file,也可以是file descriptor(尽管您可以添加 & 之前。)

如果您使用exec作为文件描述符,则允许更改在当前shell中生效。否则它们是本地的功能或循环。

示例1 -

使用fd将是while循环的本地,你不能在外面使用它:

while read line <&3; do 
    echo $line; 
done 3<test.file

示例2 -

使用fd将在当前shell中可见

exec 3<test.file
while read line <&3; do 
    echo $line; 
done

答案 2 :(得分:1)

当您使用bash标记时,请参阅AdvancedBash了解基础知识。

该链接下面的部分(示例20-2)具有以下内容

LOGFILE=logfile.txt
exec 6>&1           # Link file descriptor #6 with stdout.
                    # Saves stdout.
exec > $LOGFILE     # stdout replaced with file "logfile.txt".

这就是你要找的东西吗?