Como a conclusão do caminho do Bash funciona com o sudo?

11

A conclusão do caminho da guia não funciona (pelo menos no Ubuntu e no AFAIK Arch) com

sudo mount <whatever>

O arquivo iso que estou tentando montar não está /etc/fstab. Se eu apenas digitar

mount <whatever>

a conclusão funciona (mas é claro que o comando falha porque eu não sou root). Aparentemente, é isso sudoque quebra.

Como fazer a conclusão funcionar com o sudo?

É surpreendente que, com

sudo umount <whatever>

obras de conclusão. Como é conseguido? Olha dentro /etc/fstab?

Solução: Acabei de colocar um script de shell nas /usr/local/binchamadas sudo mount ...com os argumentos passados. A conclusão funciona ao chamar esse script, pois não existe nenhum sudocaminho.

Todos
fonte

Respostas:

11

Isso não tem nada a ver com bash, mas depende das conclusões programadas no pacote bash-completion.

De alguns comentários no arquivo /etc/bash_completion.d/mount:

# mount(8) completion. This will pull a list of possible mounts out of
# /etc/{,v}fstab, unless the word being completed contains a ':', which
# would indicate the specification of an NFS server. In that case, we
# query the server for a list of all available exports and complete on
# that instead.
#

# umount(8) completion. This relies on the mount point being the third
# space-delimited field in the output of mount(8)
#

Além disso, você encontra no arquivo principal /etc/bash_completiono seguinte comentário, que explicitamente fala sobre mounte umountcomandos:

# A meta-command completion function for commands like sudo(8), which need to
# first complete on a command, then complete according to that command's own
# completion definition - currently not quite foolproof (e.g. mount and umount
# don't work properly), but still quite useful.
#

Atualização :
o comentário mounte os umountcomandos foram removidos bash_completion no commit :

_command_offset: Restore compopts used by called command.

This fixes completions that rely on their compopts, most notably
mount(8).
Fixes bash-completion bug #313183.

Lançado embash-completion 1.90

enzotib
fonte
4

Isso pode ser facilmente resolvido consultando o Arch Wiki :

É útil ter o recurso de preenchimento automático (pressionando a tecla Tab duas vezes no teclado) depois de digitar algum comando como sudo.

Para fazer isso, adicione linhas neste formato ao seu ~/.bashrcarquivo:

complete -cf your_command

Por exemplo, para ativar o preenchimento automático após sudoe man:

complete -cf sudo
complete -cf man
Wieland
fonte
Obrigado. Observe que o preenchimento automático funciona surpreendentemente bem no caso de sudo umount. Como o enzotib aponta, esse recurso foi quebrado mounte, da última vez que verifiquei, ele também foi quebrado no Arch.
Ali
Eu apenas tentei isso no Arch e o sudo mount / me <TAB> é concluído no único caminho que configurei /etc/fstabque começa com / media.
Wieland
No meu caso, o arquivo que estou tentando montar é não no /etc/fstab. Você poderia verificar isso?
Ali
0

Não, não parece no fstab. A conclusão do bash procura comandos no caminho, aliases no bashrc e / ou bash_profile e caminhos. Portanto, se você digitar algo parecido sudo mount /mnt/some_folder, deve ser preenchido automaticamente. Talvez quando você fez o umountcaminho, estava em um caminho relativo para o seu destino e ele foi concluído automaticamente.

Patkos Csaba
fonte
Obrigado. Tenho certeza de que o preenchimento automático não funciona sudo mount /mnt/some_folder, 100% de certeza. AFAIK também não funciona no Arch Linux. Quando fiz, não umountestava no caminho relativo para o destino.
Ali
-1

Eu acho que o bash não quer ser muito complexo e permanecer portátil, então eles não procurarão no / dev para propor a conclusão de uma operação de montagem.

No entanto, ao chamar umount, ele pode facilmente procurar a saída de df / mount / etc para saber quais dispositivos estão montados e onde.

Talvez o zsh forneça a conclusão para mount, heck zsh até o preenchimento automático ao executar um comando scp ...

Aki
fonte
O arquivo que estou tentando montar é um arquivo iso no meu diretório pessoal. A conclusão não funciona. Ah, eu esqueci, conclusão com o trabalho de montagem se eu não usar o sudo. É o sudo que o quebra. Alguma ideia?
Ali
Mesmo usando caminhos absolutos? / home / user / myiso <TAB> -> myisofile.iso. depurar com sudo echo $ SHELL; sudo pwd, espero que lhe dê algumas idéias.
Aki
Sim, com caminhos absolutos. Vou tentar a depuração que você sugere. A depuração que você sugere fornece /bin/bash /home/alicomo esperado.
Ali