BASH 자동 완성 시 pmount가 중단됨

BASH 자동 완성 시 pmount가 중단됨

pmount터미널 에서 자동 완성을 사용하려고 할 때마다 중단할 때까지 터미널이 정지되어 CTRL+C자동 완성이 실제로 실행됩니다. 자동 완성은 다른 모든 것에서는 잘 작동하며, 흥미롭게도 작업 디렉터리와 독립적으로 마운트된 모든 드라이브를 pumount통해 제거를 직접 성공적으로 자동 완료할 수 있습니다 .pmount

매우 명확한 단계별 프로세스 목록:

#start pmount
pmount /de<TAB to autocomplete>
#terminal is frozen
<press CTRL+C once to unfreeze>
pmount /dev/s
pmount /dev/sd<TAB to autocomplete>
#frozen again - note the "d"
<press CTRL+C once to unfreeze>
pmount /dev/sdb

이 경우 /dev/sdb플래시 드라이브만 존재하므로 자동 완성 기능이 좀 더 똑똑해지고 예제를 제공하지 않지만 /dev/sda여전히 정지됩니다.

zsh자동 완성은 잘 작동 pmount하지만 덜 지능적으로 작동하는 구성되지 않은 새 설치를 테스트했습니다 . pmount /dev/s<TAB>선택 항목이 로 줄어들지 않지만 /dev/sdb"루트 하드 드라이브"도 포함되고 /dev/sda현재 pumount <TAB>작업 디렉터리 항목을 자동 완성합니다.

그래서 BASH의 소위 스마트 자동 완성 동작과 관련이 있다고 가정하지만 해당 동작이 어디에 구성되어 있는지조차 이해하지 못하기 때문에 원격으로 문제를 해결할 수 없습니다.

이 문제를 해결하는 방법과 문제의 원인에 대한 아이디어가 있습니까?

시스템은 Debian 8, pmount버전은 0.9.23, BASH버전은 4.3.30입니다.

답변1

/etc/bash_completion.d/pmount자동완성 참조 파일은 내 시스템 에 저장됩니다 .

해결 방법 1: 파일 (재)이동/이름 바꾸기

Tom Hunt가 제안한 것처럼 이것이 가장 간단한 솔루션입니다. 정지는 중지되지만 자동 완성은 지능적이지 않습니다. 즉, 현재 디렉터리의 파일 이름이 유지됩니다.

해결 방법 2: 자동 완성 파일 복구

참조 파일의 문제는 _pmount()파일의 라인 62에 있는 함수에서 발생합니다(가독성을 위해 새 줄이 추가됨 - 원본 파일에는 없음).

devices="$( command ls $(grep -v '^[[:space:]]*#' /etc/pmount.allow )\
$(grep 1 /sys/block/*/removable |\
sed -e 's,/sys/block/,/dev/,;s,/removable:1,*,') 2>/dev/null |\
sort -u | sed -e 's,\(^/dev/\)\(.*\),\1\2 \2,' ; \
#this last line is of interest, as the errors occur here
grep $mdir /proc/mounts | sed -e 's,.*\($mdir/[^ ]*\).*,\1,' )"

실수는

grep $mdir /proc/mounts

변수가 $mdir이전에 정의되지 않았으므로 스크립트가 중단됩니다.

그래서 정의를 추가했습니다.mdir

mdir="$(readlink -f /media)"

_pumount()36행과 같이 동일한 스크립트(75행 참조) mdir에서 가져온 함수는에디아(또는숫자)목차pmount이 외에도 보안상의 이유로 함수의 로컬 변수도 추가했습니다 ( mdir라인 _pmount()25).

이제 자동 완성 기능이 중단되지만 이동식 드라이브의 파티션이 마운트된 경우 마운트된 드라이브, 해당 마운트 지점 및 /proc/mounts다음과 같은 의 모든 정보가 표시되므로 이상하게 작동합니다.

/media/sdc1
rw,nosuid,nodev,noexec,relatime,uid=1000,gid=1000,fmask=0177,dmask=0077,codepage=437,iocharset=iso8859-1,shortname=mixed,quiet,utf8,errors=remount-ro

이는 오류가 발생한 동일한 라인 62로 인해 발생합니다. 이제 문제는 다음 부분에 있습니다.

grep $mdir /proc/mounts | sed -e 's,.*\($mdir/[^ ]*\).*,\1,'

작은 따옴표가 평가를 억제하기 때문에 명령이 실패해야 하는 경우 sed(예: 예상대로 작동하지 않거나 명령으로 실패하지 않음) $mdir를 큰따옴표로 변경했습니다.

grep $mdir /proc/mounts | sed -e "s,.*\($mdir/[^ ]*\).*,\1,"

pmount자동 완성 기능은 이제 정보를 건너뛰지 만 마운트 지점을 /proc/mounts포함하여 마운트된 파티션을 계속 표시합니다 ./media/sdc1

표준 동작이 무엇인지는 알 수 없지만 pmount마운트된 모든 파티션 목록을 실제로 억제하기 위해 다음을 수행했으며 다시 초기 라인 62가 다음으로 변경되었습니다. (가독성을 위해 줄 바꿈 추가 - 자동 완성 스크립트에 있어야 함) 삭제) :

 devices="$( command ls $(grep -v '^[[:space:]]*#' /etc/pmount.allow )\
 $(grep 1 /sys/block/*/removable |\
 sed -e 's,/sys/block/,/dev/,;s,/removable:1,*,') 2>/dev/null |\
 sort -u | sed -e 's,\(^/dev/\)\(.*\),\1\2 \2,' \
 #previous block identical to original script
 #the following pipe replaces a semicolon from the original script
 #and so does anything that follows 
 | grep -v "$( if [[ $( grep $mdir /proc/mounts ) ]] ;
               then grep $mdir /proc/mounts |\
                    sed -e "s,.*\($mdir/[^ ]*\).*,\1," \
                        -e "s,$mdir/,," -e 's, ,\|,g' ;
               else echo $mdir ; fi \
             )"
 )"

이제 원본 스크립트와는 달리 grep처음 두 s의 출력은 에서 가져온 마운트 grep가 아닌 마운트된 파티션이 필터링되는 로 파이프됩니다 . 이 루프는 빈 파티션과 마운트된 파티션을 구별해야 합니다 ./media/proc/mountsif/media

이러한 변경으로 인해 pmount동작은 다음과 같습니다.

pmount <TAB to autocomplete>
/dev/sdc   /dev/sdc1  /dev/sdc2  /dev/sr0   sdc        sdc1       sdc       sr0
pmount sdc1
#successful mounting of sdc1
pmount <TAB to autocomplete>
/dev/sdc  /dev/sdc2  /dev/sr0  sdc       sdc2       sr0

즉, 마운트된 파티션은 표시되지 않지만 드라이브의 다른 파티션(및 드라이브 자체)은 계속 표시됩니다.

mdir첫 번째 단계에서 정의의 중요성을 기억하세요!

참고 사항pmount

이 검색은 자동으로 수행됩니다 /sys/block/*/removable. 1즉, 이동식 비트가 설정된 장치만 나열됩니다. 그러나 다른 드라이브는 예를 들어 입력하여 설치할 수 있지만 pmount /dev/sdd1자동 완성에는 표시되지 않습니다. AFAIK 이는 예상되는 동작이므로 그대로 두겠습니다. 제 경우에는 파티션을 실행하던 외장 하드 드라이브에서 이런 일이 발생했습니다 ext4.

관련 정보