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

时间:2018-03-28 14:17:42

标签: bash

我无法理解为什么在尝试调用我的脚本停止后的子shell后调用read,但是在读取之前没有使用susbshel​​l调用正常工作

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中修复

1 个答案:

答案 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