【问题标题】:Why does this command kill my shell?为什么这个命令会杀死我的 shell?
【发布时间】:2015-09-13 12:14:09
【问题描述】:

更新:这是一个更通用的命令,可重现性更高。 ShellFish 发现有一个更通用的模式:

non-existingcommand & existingcommand &

例如,

xyz & echo &

另外,我让一位同事尝试使用 ssh 连接,但他的连接在运行命令后关闭。所以这似乎并不局限于某个终端模拟器。

原始问题

echo?a=1&b=2|3&c=4=

行为:

执行命令后,我当前的 Gnome 终端选项卡会在没有警告的情况下关闭。

背景:

我们正在使用 curl 命令测试 URL,但忘记引用它或转义特殊字符(因此是 & 和等号)。期待一些关于语法问题或找不到命令的废话,我们反而看着我们的 shell 简单地退出。我们花了一些时间将命令范围缩小到会导致该行为的最低限度。

我们在 Ubuntu 14.10 上使用 Gnome 终端。奇怪的是,即使我从会话中分离,我运行 byobu 的另一个盒子上也不存在这种行为。它也不会发生在 Cygwin 上。不幸的是,否则我仅限于使用 Ubuntu 14.10 进行测试。

注意:以下命令也会杀死我的终端,但只有一半时间

echo?a=1&b=2&c=3=

附加测试:

有人推荐使用 subshel​​l...

guest-cvow8T@chortles:~$ bash -c 'echo?a=1&b=2|4&c=3='
bash: echo?a=1: command not found
guest-cvow8T@chortles:~$ bash: 4: command not found

没有出口。

【问题讨论】:

  • 如果你在子 shell(即bash -c 'echo?a=1&b=2|3&c=4=')中运行它,它会退出吗?它退出时是否打印任何消息?您在 gnome-terminal 中使用什么外壳(echo $SHELL 输出什么?)? set +o | grep errexit 输出什么?
  • 请注意,echo?a=1&b=2|3& 也会杀死终端,它比第一个短。
  • @Close voter,这不是关于shell 本身,而是关于分析潜在的解析器故障(或更糟)。因此,我相信提问者在这里会得到比超级用户更好的答案。
  • 一般行为是这样的:non-existing command & any command &。由这种结构组成的命令总是会杀死终端。
  • @ShellFish 我可以使用123 & ls & 重现它 - 我无法重现问题中的示例。也许我们应该换个问题?

标签: linux bash ubuntu


【解决方案1】:

我可以在 Ubuntu VM 中重现此问题,但不能在 OEL VM 上重现。不同之处在于,在 Ubuntu 上安装了包 command-not-found,它提供了 python 脚本 /usr/lib/command-not-found。该脚本负责退出 shell。

/etc/bash.bashrc中,有一个函数command-not-found_handle,它执行/usr/lib/command-not-found。因此,当我们尝试执行此类命令时,终端会退出。当我注释掉对/usr/lib/command-not-found 的调用时,问题不再重现。

来自我的/etc/bash.bashrc

function command_not_found_handle {
     #check because c-n-f could've been removed in meantime 
     if [ -x /usr/lib/command-not-found ]; then 
          /usr/bin/python /usr/lib/command-not-found -- "$1"
          return $?
     elif [ -x /usr/share/command-not-founf/command-not-found ]; then
          /usr/bin/python /usr/share/command-not-founf/command-not-found -- "$1"
          return $?
     else
          printf "%s:command not found\n" "$1"
          return 127
     fi
}

【讨论】:

  • 哇,很棒的发现!知道为什么脚本会导致 shell 偶尔退出吗?
  • sn-p 正是 /etc/bash.bashrc 文件中该函数的内容吗?因为那缩进很差,语法上无效。
  • 我看不出有任何原因导致控制外壳退出。我唯一能看到的是向上级联的信号/中断command-not-found 二进制文件。
  • Bash 中的 command-not-found 处理程序在出现错误时不一定很健壮。过去,当它运行有错误的代码或被中断时,我已经看到了相当激烈的结果。
  • 可以说bash 应该是固定的,那么。插件链中的薄弱环节不应该是主机本身。
猜你喜欢
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 2017-01-05
  • 2021-06-03
相关资源
最近更新 更多