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/mounts
if
/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
.