为什么exec {fd} <file assign =“”file =“”descriptor =“”of =“”file =“”to =“”fd?=“”

时间:2016-10-05 18:17:34

标签: bash

=“”

我找到了一个获取'file'文件描述符的代码。代码如下。

{{1}}

不幸的是,代码没有提供为什么它可以通过exec获取文件描述符。即使在我阅读了bash手册之后,我也无法理解exec在这里执行的命令。有人知道上面代码的机制,请告诉我。非常感谢你。

2 个答案:

答案 0 :(得分:3)

语法的特殊位是标识符周围的大括号。通常,您指定一个表达式,该表达式将评估为整数值,如

C:\Users\User>pypy -m timeit -n10 -s"from sympy import sieve" "primes = list(sieve.primerange(1, 10**6))"
10 loops, best of 3: 2.12 msec per loop

C:\Users\User>python -m timeit -n10 -s"from sympy import sieve" "primes = list(sieve.primerange(1, 10**6))"
10 loops, best of 3: 11.9 msec per loop

大括号包含一个名称,而不是一个整数,它要求shell为我们找到一个可用的描述符,打开该描述符上的文件,然后将名称设置为该值。

exec 3<file   # Open file for reading on fd 3
fd=5
exec $fd<file # Open file for reading on fd 5

答案 1 :(得分:2)

这有点奇怪。

通常,当您运行程序时,您可以指定重定向:

cat 0<file #= cat <file

这基本上通过catfork创建了一个流程。然后opens filedup将其文件描述符添加到filedescriptor 0,然后exec {s} cat在子项内。

 //Equivalent C code:
 pid=fork();  
 //... (=error checking)
 if(0==pid){
      //child
      int fd; 
      fd = open("file", O_RDONLY);
      //...
      dup2(fd, 0);
      //..
      execvpl("cat", "cat", (char*)0); 
      //..
 }

如果您改为exec cat 0<file,则不会fork, 并且重定向和exec调用将在当前进程中发生:

int fd; 
fd = open("file", O_RDONLY);
//...
dup2(fd, 0);
//..
execvpl("cat", "cat", (char*)0); 
//..

Shells重载exec,这样如果没有提供exec的程序,只会完成opendup ing(它们一起转换为shell重定向)在当前的过程中。

这允许您重定向当前进程:

exec 0<file       #standard input is the file "file" from this point forward

Bash和其他高级shell进一步扩展了这一点,允许您使用exec语法简单地打开文件并获取文件描述符编号。

exec {fd}<file

基本上是他们的做法:

fd = open("file", O_RDONLY);