回显文件描述符会覆盖文件吗?

Zoo*_*ose 7 bash files exec

我在尝试写入文件描述符时无法理解发生了什么?它似乎覆盖了原始内容?这是预期的行为吗?

我在下面的例子中复制了这个:

$ echo "The quick brown fox ..." > example.txt  
$ echo "The quick brown fox ..." >> example.txt
$ cat example.txt
The quick brown fox ...  
The quick brown fox ...
$ exec 88<>example.txt
$ cat example.txt
The quick brown fox ...  
The quick brown fox ...
$ echo "jumped" >&88  
$ cat example.txt
jumped  
ck brown fox ...  
The quick brown fox ...
$ echo "jumped" >&88  
$ cat example.txt
jumped  
jumped  
n fox ...  
The quick brown fox ...
Run Code Online (Sandbox Code Playgroud)

Ste*_*ris 11

因为您没有对描述符 88 进行任何读取,所以当前查找位置为“0”,因此写入发生在该点。

相反,如果您在此之前阅读了该文件,则会发生附加:

bash-4.2$ cat <&88
The quick brown fox ...
The quick brown fox ...

bash-4.2$ echo hello >&88

bash-4.2$ cat example.txt 
The quick brown fox ...
The quick brown fox ...
hello

bash-4.2$ echo more >&88

bash-4.2$ cat example.txt 
The quick brown fox ...
The quick brown fox ...
hello
more
Run Code Online (Sandbox Code Playgroud)

  • @Zoonose:当你执行 `cat example.txt` 时,cat 打开文件,获取一个从文件开头开始查找位置的描述符,读取它直到结束,然后关闭描述符。当你执行 `exec 88&lt;&gt;example.txt` 时,_bash_ 打开文件,得到一个从文件开头开始查找位置的描述符。文件本身不维护查找位置,而是为每个打开的文件描述符维护一个位置。 (4认同)
  • 即使你先`cat &lt;&amp;88`,接下来的写入也只是对写入停止位置的常规写入,而不是适当的追加。同时它们可能会覆盖另一个进程写入的数据。如果需要追加,那么 `&gt;&gt;` 重定向操作符是(唯一的)方法。据我所知,Bash 并没有真正的查找文件的方法,而且它也不允许同时使用读/写模式 _ 和 追加模式打开。 (4认同)