我无法理解为什么在尝试调用我的脚本停止后的子shell后调用read,但是在读取之前没有使用susbshell调用正常工作
command_not_found_handle()
{
(true) # subshell call
read line
echo "$line"
}
bash-4.4$ foo
[1]+ Stopped foo
没有子shell调用它可以正常工作:
command_not_found_handle()
{
read line
echo "$line"
}
bash-4.4$ foo
smth
smth
bash-4.4$
UPD。已在bash 5.0中修复
答案 0 :(得分:0)
正如@chepner所说,这似乎是一个错误。他们在一个自已删除的答案中指出,运行fg
允许命令继续,这表明Bash认为command_not_found_handle
没有连接到标准输入。
添加一些调试语句表明我们已经超过了子shell,但是有一些关于子shell泄漏到command_not_found_handle
环境的状态,导致Bash认为stdin在read
显然不可用。
subshell() {
echo "Start subshell"; (echo "In sub-shell"); echo "End subshell"
}
try_read() {
printf "Start try_read\nInput: "; 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