RedHat에서는 bash/gdb 자동 완성 코어 파일이 있지만 Ubuntu에서는 그렇지 않습니다.

RedHat에서는 bash/gdb 자동 완성 코어 파일이 있지만 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

센트OS 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> 

그러면 핵심 파일 이름이 성공적으로 완성됩니다.

우분투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동일합니다 .

질문:

내가 왜 그럴 수 있지?탭 완료Core-file-name은 CentOS에서는 사용할 수 있지만 Ubuntu에서는 사용할 수 없습니까?

답변1

이는 프로그래밍 가능한 완성과 관련이 있습니다. 프로그램이 처리할 수 없는 일을 제거함으로써 사용자의 삶을 더 쉽게 만들 수 있다는 생각입니다.

그러나 실제로는 완성에서 무언가를 제외함으로써 완성 제외에도 불구하고 필연적으로 사용하고 싶은 무언가로 끝나게 되는 경우가 많습니다. 그 시점에서 프로그래밍 가능한 완성은 도움이 되기보다는 부담이 됩니다.

이 문제는 세 가지 방법으로 해결할 수 있습니다.

  • 언로드는 프로그래밍 방식으로 수행할 수 있습니다. 필요하지 않은 선택 기능입니다.가지다당신이 그것을 사용하고 싶지 않다면. 당신은 이것을 할 수 있습니다apt-get remove bash-completion
  • 어떤 이유로 bash 완료를 제거하고 싶지 않거나 제거할 수 없는 경우 를 실행 complete -r하면 모든 완료 규칙이 다시 제거됩니다. 비슷한 접근 방식으로 이 작업을 수행하면 .bashrc규칙이 처리된 다음 다시 삭제되기 때문에 bash가 시작될 때 약간의 성능 저하가 있다는 점을 제외하면 효과는 첫 번째 옵션과 동일합니다.
  • bash가 가끔 파일 이름을 완성하도록 강제하려면 대신 alt+를 사용 하여 bash가 파일 이름 완성을 수행하도록 할 수 있습니다./tab

답변2

이는 Ubuntu 시스템의 사용자 정의 자동 완성 동작이 gdb핵심 파일 이름과 일치하지 않기 때문에 발생합니다.

at의 사용자 정의 완성 기능을 조정하여 동작을 수정할 수 있습니다 gdb.

/usr/share/bash-completion/completions/gdb

예를 들어, 핵심 파일의 이름을 약간 더 고유하게 지정하여( corexyx...백업을 피할 수 있도록) 마무리를 망쳤습니다. 나는 줄을 바꿨다 :

COMPREPLY+=( $( compgen -f -X '!?(*/)core?(.+([0-9]))' -o plusdirs \

도착하다

COMPREPLY+=( $( compgen -f -X '!?(*/)core?(*)' -o plusdirs \

이는 단순히 코어 파일을 허용하는 패턴을 확장합니다(특히 다음 문자가 core있는 경우 ..

GDB의 "스마트" 완성이 일치하는 항목을 생성하지 않을 때 기본 일치 항목을 포함하려면 주석에서 Mark가 제안한 대로 수행하고 마지막 줄을 다음과 같이 변경할 수 있습니다.

complete -F _gdb gdb

도착하다

complete -o default -F _gdb gdb

이 옵션에 대한 문서는 다음과 같습니다 -o default.

compspec이 정의될 때 -o 기본 완료 옵션이 제공되면, compspec(및 기본 bash 완성)이 일치를 생성하지 않을 때 readline의 기본 완성이 수행됩니다.

마지막으로, complete -F _gdb gdb줄 전체를 주석 처리하여 GDB의 스마트 완성 기능을 완전히 비활성화할 수 있습니다.

관련 정보