我不明白为什么在子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