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.