为什么python在这里运行?

为什么python在这里运行?

Ubuntu 20.04。使用 bash。我打错了。我可以简化为:

a </

基本上:从目录重定向带有 stdin 的未知命令。

我期望的结果是:

a: command not found

但是使用 Ubuntu 20.04(不是 debian)和 bash(不是 busybox、dash、ksh、tcsh)时,我得到:

Fatal Python error: init_sys_streams: <stdin> is a directory, cannot continue
Python runtime state: core initialized

Current thread 0x00007f83aacaa740 (most recent call first):
<no Python frame>

发生了什么事?为什么 Python 会参与其中?

答案1

Bash 通过一个函数实现此功能command_not_found_handle

$ declare -f -p command_not_found_handle
command_not_found_handle ()
{
    if [ -x /usr/lib/command-not-found ]; then
        /usr/lib/command-not-found -- "$1";
        return $?;
    else
        if [ -x /usr/share/command-not-found/command-not-found ]; then
            /usr/share/command-not-found/command-not-found -- "$1";
            return $?;
        else
            printf "%s: command not found\n" "$1" 1>&2;
            return 127;
        fi;
    fi
}

如您所见,该函数尝试调用/usr/lib/command-not-found- 这是一个python脚本:

$ file /usr/lib/command-not-found
/usr/lib/command-not-found: Python script, ASCII text executable

使用函数名称(在本例中为a)作为参数。但是 shell 已经将标准输入重定向至/- 因此它实际上是python3使用输入重定向进行调用:

$ python3 </
Fatal Python error: init_sys_streams: <stdin> is a directory, cannot continue
Python runtime state: core initialized

Current thread 0x00007f16b0ab0740 (most recent call first):
<no Python frame>

如果使用以下命令运行命令,则可以更清楚地看到该序列set -x

$ set -x
$ 
$ a </
+ a
+ '[' -x /usr/lib/command-not-found ']'
+ /usr/lib/command-not-found -- a
Fatal Python error: init_sys_streams: <stdin> is a directory, cannot continue
Python runtime state: core initialized

Current thread 0x00007feb94250740 (most recent call first):
<no Python frame>
+ return 1

相关内容