command_not_found_handle:如果我在执行子壳后尝试读取,任务将停止



我不明白为什么在子shell后尝试调用read后我的脚本停止,但是在读取之前没有susbshell调用就可以正常工作

command_not_found_handle()
{
(true) # subshell call
read line
echo "$line"
}
bash-4.4$ foo
[1]+  Stopped                 foo

如果没有子壳调用,它可以正常工作:

command_not_found_handle()
{
read line
echo "$line"
}
bash-4.4$ foo
smth
smth
bash-4.4$ 

更新。在 bash 5.0 中修复

正如@chepner所说,这似乎是一个错误。他们在删除后的答案中指出,运行fg允许命令继续,这表明Bash认为command_not_found_handle与stdin无关。

添加一些调试语句表明我们通过了子外壳,但是关于子外壳的某些状态泄漏到command_not_found_handle环境中,导致 Bash 认为 stdin 在明显可用时无法read

subshell() {
echo "Start subshell"; (echo "In sub-shell"); echo "End subshell"
}
try_read() {
printf "Start try_readnInput: "; read line; echo "End try_read $line"
}
command_not_found_handle() {
echo "Start CNFH $*"; subshell; try_read; echo "End CNFH"
}

这导致我们在read挂起 ,subshell完成后,直到我们fg停止的作业:

$ foo
Start CNFH foo
Start subshell
In sub-shell
End subshell
Start try_read
Input:
[1]+  Stopped                 foo
$ fg
foo
bar
End try_read bar
End CNFH

删除subshell调用可使read按预期取得进展:

$ command_not_found_handle() { echo "Start CNFH $*"; try_read; echo "End CNFH"; }
$ foo
Start CNFH foo
Start try_read
Input: bar
End try_read bar
End CNFH

最新更新