linux 为什么在执行grep命令后,文件描述符会发生重定向更改?[已关闭]

ejk8hzay  于 2023-10-16  发布在  Linux
关注(0)|答案(2)|浏览(125)

**已关闭。**此问题不符合Stack Overflow guidelines。它目前不接受回答。

这个问题似乎不是关于在help center定义的范围内编程。
21天前关闭。
Improve this question

$exec 3<input.txt
$sleep 60 >&3 &
[1] 32524
$ cd/proc/32534/fd 
$ ls -l
lrwx------. 1 zhangchen zhangchen 64 Sep 24 18:29 0 -> /dev/pts/0
lr-x------. 1 zhangchen zhangchen 64 Sep 24 18:29 1 -> /home/zhangchen/input.txt
lrwx------. 1 zhangchen zhangchen 64 Sep 24 18:29 2 -> /dev/pts/0
lr-x------. 1 zhangchen zhangchen 64 Sep 24 18:29 3 -> /home/zhangchen/input.txt

$grep test_word <&3
test_word
$grep test_word <&3
[nothing output]

grep不是用describer 1搜索文件吗,为什么grep修改了文件describer 3?

kxeu7u2r

kxeu7u2r1#

它不会改变FD 3上打开的文件,也不会改变文件的内容。改变的是 * 您在文件中的位置 *。
你打开input.txt一次。
在运行grep之前,文件指针位于文件的前面。
运行grep后,文件指针位于文件末尾。
它仍然指向同一个文件,但您不再位于文件的前端,因此如果您正在运行的程序不使用seek()倒回前端,则没有内容可供读取。
如果你运行一个程序,你可以 * 倒带到前面:

# Define a "rewind" function that uses Python
rewind() {
  python -c 'import os, sys; os.lseek(int(sys.argv[1]), 0, os.SEEK_SET)' "$@"
}

# Create our input file
echo 'test_word' >input.txt

# Redirect from the input file
exec 3<input.txt

# Read from the input file once
grep test_word <&3

# Rewind the input file back to the beginning
rewind 3

# _Now_ we can read from the input file a second time
grep test_word <&3
ve7v8dk2

ve7v8dk22#

你的问题模棱两可:你提供了一些命令和它们的输出,后面跟着一个问题,希望读者理解你的意图;我建议如果你花更多的时间仔细地写你的问题,你会得到更有用的答案。也就是说,如果我正确理解了你的问题,grep使用的是文件描述符3,因为你用<&3显式重定向了标准输入。

相关问题