gpt4 book ai didi

bash - 处理命名管道时,fish shell 和 bash 有什么区别?

转载 作者:行者123 更新时间:2023-12-04 11:58:20 25 4
gpt4 key购买 nike

在 fish shell 中执行这些命令时

$ mkfifo answer
$ nc -vv -l -k -p 8001 <answer | tee -a answer
命令挂起。
如果我写信给 answer通过 echo "" > answer .然后是 nc恢复并开始正确聆听。
如果相反,我 CTRL-C挂起过程,这里是消息:
^C<W> fish: An error occurred while redirecting file 'answer'
open: Interrupted system call
另一方面,在 bash 中,执行时:
$ mkfifo answer
$ nc -vv -l -k -p 8001 <answer | tee -a answer
Listening on localhost 8001
命令 没有 挂起并直接开始收听。
在 fish 和 bash 中发生了什么不同的事情来解释这种不同的行为?

最佳答案

关键区别在于fish在fork之前打开重定向的文件。在父 shell 中,而 bash 在 fork 之后执行此操作,在子进程中。
当您打开命名管道进行读取时,open 调用将阻塞,直到有相应的写入器(反之亦然)。您的管道包含读取器和写入器,但要求相应的打开调用在子进程中并行发生。在 fish nc在文件打开之前无法启动,因此您会陷入僵局。
一种解决方法是安排子进程自行打开文件,而不是使用重定向。例如,这将避免死锁:

cat answer | nc -vv -k -l -p 8001  | tee -a answer
fish 的行为方式如此,因为它也使用线程,这限制了您在 fork 子节点中可以执行的操作。

关于bash - 处理命名管道时,fish shell 和 bash 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69216897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com