bash / gdb 在 RedHat 上自动完成核心文件,但在 Ubuntu 上没有

Ste*_*mer 5 bash gdb

当程序转储核心时,我们已设置kernel.core_pattern将核心文件放在具有特定文件名等的特定位置。

kernel.core_pattern = | /var/core_file_handler.py %e %s %p %lu %g %t
Run Code Online (Sandbox Code Playgroud)

这是目标目录和示例核心文件:

$ ls -l /var/cores
drwxr-xr-x 2 root root 4.0K Mar 23 09:42 app

$ ls -l /var/cores/app/
-rw-r--r-- 1 root root 60510208 Mar 23 09:42 2016.03.23_09.42.14.867727_11_SIGSEGV_u
Run Code Online (Sandbox Code Playgroud)

CentOS 6.7

在 CentOS 6.7 上,我有 bash 4.1.2 和 gdb 7.5

$ bash --version
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)

$ gdb --version
GNU gdb (GDB) Red Hat Enterprise Linux (7.5.0.20120926-26.el6)
Run Code Online (Sandbox Code Playgroud)

当我想打开一个核心文件时,我可以输入 gdb 然后用tab 完成路径和核心文件

gdb ./app /var/cores/app/201.... <tab> 
Run Code Online (Sandbox Code Playgroud)

这将成功完成核心文件名的制表符。

Ubuntu 14.04

在 Ubuntu 14.04 上,我有 bash 4.3.11 和 gdb 7.7.1

$ bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)

$ gdb --version
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
Run Code Online (Sandbox Code Playgroud)

当我想打开一个核心文件时,我可以输入 gdb 然后tab 完成路径,但不是核心文件

gdb ./app /var/cores/app/  <tab> <tab> <tab>....
Run Code Online (Sandbox Code Playgroud)

不会制表符完成核心文件名。它只是被卡住了/var/cores/app/,不会再进一步​​了

  • /var/cores/app两台机器上的访问权限相同
  • /var/cores/app/core_file两台机器上的访问权限相同

题:

为什么我可以在 CentOS 上用制表符完成核心文件名,而在 Ubuntu 上不能?

Wou*_*lst 3

这与可编程完成有关。这个想法是,通过排除程序无法处理的事情,可以让用户的生活变得更轻松。

然而,在实践中,我经常发现,通过从完成中排除一些东西,你将不可避免地得到一些虽然完成排除但你确实想要使用的东西。到那时,可编程完成就成为负担而不是帮助。

您可以通过三种方法解决此问题:

  • 卸载可编程完成。这是一项可选功能,如果您不想使用,则可以不必使用。你可以通过以下方式做到这一点apt-get remove bash-completion
  • 如果您出于某种原因不想(或不能)删除 bash-completion,您可以运行complete -r,这会再次删除所有完成规则。如果您从类似的方式执行此操作.bashrc,效果将与第一个选项相同,只是在 bash 启动时会出现一些性能损失,因为规则会被处理然后再次删除。
  • 如果您只是想偶尔强制 bash 完成文件名,可以使用alt+/而不是tab强制 bash 执行文件名完成。