pmount trava no autocompletar BASH

2

Sempre que eu tento usar o preenchimento automático em combinação com pmount , o terminal congela até que eu aborte via CTRL+C , o que leva ao autocompletar a ser realmente executado. O preenchimento automático funciona bem em qualquer outro aspecto e, curiosamente, a desmontagem de pumount faz o autocompletar diretamente e com êxito para qualquer unidade montada via pmount independentemente do meu diretório de trabalho.

Para ser muito clara, uma lista de processos passo a passo:

#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

Observe que, neste caso, /dev/sdb é a única unidade flash presente, portanto, o preenchimento automático é um pouco inteligente, por não oferecer, por exemplo, /dev/sda , mas ainda congela.

Eu testei uma instalação nova, não configurada, de zsh , quando o autocompletion funciona bem com pmount , mas não se comporta de maneira inteligente: em pmount /dev/s<TAB> , a escolha não é reduzida para /dev/sdb , mas também inclui "disco rígido raiz" /dev/sda e pumount <TAB> autocompletes para entradas do diretório de trabalho atual.

Então, presumo que esteja conectado ao suposto comportamento de autocomplicação inteligente do BASH, mas não posso resolver remotamente o problema, pois não entendo onde esse comportamento está configurado.

Alguma idéia de como resolver o problema e de onde ele surge?

O sistema é Debian 8, pmount versão é 0.9.23, BASH é 4.3.30

    
por Fiximan 18.11.2015 / 23:10

1 resposta

2

O arquivo de referência de autocompletar é armazenado em /etc/bash_completion.d/pmount no meu sistema.

Solução 1: (Re) movendo / renomeando o arquivo

Como sugerido por Tom Hunt, esta é a solução mais simples. O enforcamento pára, no entanto, o preenchimento automático não é inteligente, ou seja, furar a nomes de arquivos do diretório atual.

Solução 2: Reparando o arquivo de preenchimento automático

O problema com o arquivo de referência surge na função _pmount() na linha 62 do arquivo (novas linhas adicionadas para facilitar a leitura - não no arquivo original):

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/\)\(.*\), ,' ; \
#this last line is of interest, as the errors occur here
grep $mdir /proc/mounts | sed -e 's,.*\($mdir/[^ ]*\).*,,' )"

com o erro sendo para

grep $mdir /proc/mounts

a variável $mdir não está definida anteriormente e, portanto, o script trava.

Então, adicionei a definição de mdir

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

como retirado da função _pumount() do mesmo script (ver linha 75) em p. a linha 36 como mdir parece ser m edia (ou m ount) dir ectory, ou seja, o ponto de montagem padrão para pmount . Além disso, também adicionei mdir às variáveis locais da função _pmount() (linha 25) por motivos de segurança.

O preenchimento automático agora para de ser interrompido, mas se a partição de uma unidade removível for montada, ela se comportará de maneira estranha, mostrando a unidade montada, seu ponto de montagem e todas as informações de /proc/mounts , por exemplo:

/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

Isto é devido à mesma linha 62, onde o erro ocorreu, agora o problema é esta parte:

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

em que o comando sed deve falhar (ou seja, não funcionar como pretendido, não falhar como um comando), pois as aspas simples suprimem a avaliação de $mdir , alterando-as para aspas duplas:

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

pmount autocompletion agora ignora as informações de /proc/mounts , mas ainda mostra as partições já montadas, incluindo o ponto de montagem /media/sdc1 .

Eu não posso dizer qual é o comportamento padrão de pmount , mas eu fiz o seguinte para suprimir a listagem de quaisquer partições que já foram montadas, novamente a linha inicial 62 agora é alterada para (novas linhas adicionadas para legibilidade - deve ser removido no script de preenchimento automático):

 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/\)\(.*\), ,' \
 #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/[^ ]*\).*,," \
                        -e "s,$mdir/,," -e 's, ,\|,g' ;
               else echo $mdir ; fi \
             )"
 )"

Agora, em contraste com o script original, os dois primeiros grep s 'são canalizados para um grep em que as partições já montadas são filtradas em comparação com todas as montagens em /media tiradas de /proc/mounts . O loop if é necessário para diferenciar os casos de um /media vazio e um com partições já montadas.

Com essas alterações, pmount se comportará da seguinte forma:

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

Ou seja. a partição montada é suprimida enquanto outra partição da unidade (e a própria unidade) ainda são exibidas.

Por favor, note a importância de definir mdir como o primeiro passo!

Nota lateral sobre pmount

Observe que essa preenchimento automático varre /sys/block/*/removable para 1 , ou seja, apenas lista dispositivos em que o bit removível está definido. No entanto, outras unidades podem ser montadas inserindo-as por meio de, e. pmount /dev/sdd1 , eles simplesmente não serão exibidos no preenchimento automático. AFAIK este é o comportamento pretendido e eu vou mantê-lo como está. No meu caso, isso acontece para um disco rígido externo em que tenho uma partição ext4 em execução.

    
por 25.11.2015 / 21:36