我们可以实际为文件描述符号分配任何文件吗?
答案 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 descriptor
和source
的数字,可以是file
,也可以是file descriptor
(尽管您可以添加 &
之前。)
如果您使用exec
作为文件描述符,则允许更改在当前shell中生效。否则它们是本地的功能或循环。
使用fd将是while循环的本地,你不能在外面使用它:
while read line <&3; do
echo $line;
done 3<test.file
使用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".
这就是你要找的东西吗?