Файл bash / gdb для автозаполнения ядра на RedHat, но не на Ubuntu

Когда программа сбрасывает ядро, мы установили наш kernel.core_pattern для размещения основного файла в определенном месте с определенным именем файла и т. Д.

 kernel.core_pattern = | /var/core_file_handler.py %e %s %p %lu %g %t 

Вот целевой каталог и образец файла ядра:

 $ 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 

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) 

Когда я хочу открыть основной файл, я могу ввести gdb, а затем вкладку завершить путь и файл ядра

 gdb ./app /var/cores/app/201.... <tab> 

Это позволит успешно заполнить имя основного файла.

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 

Когда я хочу открыть основной файл, я могу ввести gdb, а затем вкладку завершить путь, но не основной файл

 gdb ./app /var/cores/app/ <tab> <tab> <tab>.... 

Это не приведет к заполнению имени основного файла . Он просто застревает в /var/cores/app/ и больше не будет идти дальше

  • Разрешения доступа к /var/cores/app одинаковы на обеих машинах
  • Разрешения доступа к /var/cores/app/core_file одинаковы на обеих машинах

Вопрос:

Почему я могу заполнить имя основного файла в CentOS, но не на Ubuntu?

Это связано с программируемым завершением. Идея состоит в том, что, исключая вещи, с которыми программа не может справиться, вы делаете жизнь проще для пользователей.

На практике, однако, я часто нахожу, что, исключив вещи от завершения, вы неизбежно получите то, что завершение исключает, но которое вы действительно хотите использовать. В этот момент программируемое завершение – это бремя, а не помощь.

Существует три способа устранения этой проблемы:

  • удалить программируемое завершение. Это дополнительная функция, которую вам не нужно использовать, если вы этого не хотите. Вы можете сделать это с помощью apt-get remove bash-completion
  • если вы не хотите (или не можете) удалить пополнение баха по любой причине, вы можете запустить complete -r , который снова удалит все правила завершения. Если вы сделаете это из-за чего-то вроде .bashrc , эффект будет таким же, как и первый вариант, за исключением того, что при запуске bash наблюдается небольшая потеря производительности, так как правила обрабатываются и затем снова удаляются.
  • если вы просто хотите иногда заставить bash завершить имя файла, вы можете использовать alt + / а не tab чтобы заставить bash выполнить завершение имени файла.