¿Cómo funciona la finalización de la ruta Bash con sudo?

11

La finalización de la ruta de tabulación no funciona (al menos en Ubuntu y AFAIK Arch) con

sudo mount <whatever>

El archivo iso que estoy tratando de montar no está en /etc/fstab. Si solo escribo

mount <whatever>

la finalización funciona (pero, por supuesto, el comando falla ya que no soy root). Aparentemente es lo sudoque lo rompe.

¿Cómo puede hacer que la finalización funcione con sudo?

Es sorprendente que con

sudo umount <whatever>

Obras de terminación. ¿Cómo se logra? ¿Se ve en /etc/fstab?

Solución: Acabo de poner un script de shell en /usr/local/binesas llamadas sudo mount ...con los argumentos que se le pasan. La finalización funciona cuando se llama a este script, ya que no hay sudoen el camino.

Ali
fuente

Respuestas:

11

Esto no tiene nada que ver bash, pero depende de las finalizaciones programadas en el paquete bash-completion.

De algunos comentarios en el archivo /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)
#

Además, encontrará en el archivo principal /etc/bash_completionel siguiente comentario, que explícitamente habla sobre mounty 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.
#

Actualización :
el comentario mounty los umountcomandos se eliminaron de bash_completion la confirmación :

_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.

Lanzado enbash-completion 1.90

enzotib
fuente
4

Esto se puede resolver fácilmente buscando en Arch Wiki :

Es útil tener la función de autocompletar (presionar la tecla Tab dos veces en el teclado) después de escribir algún comando como sudo.

Para hacer esto, agregue línea (s) en este formato a su ~/.bashrcarchivo:

complete -cf your_command

Por ejemplo, para habilitar el autocompletado después sudoy man:

complete -cf sudo
complete -cf man
Wieland
fuente
Gracias. Tenga en cuenta que el autocompletado funciona sorprendentemente bien en caso de sudo umount. Como señala enzotib, esta característica está rota mounty la última vez que lo revisé, también estaba rota en Arch.
Ali
Acabo de probar esto en Arch y sudo mount / me <TAB> completa a la única ruta que configuré /etc/fstabque comienza con / media.
Wieland
En mi caso, el archivo que estoy tratando de montar no está en /etc/fstab. ¿Podrías comprobar esto?
Ali
0

No, no se ve en fstab. La finalización de Bash busca comandos en la ruta, alias en bashrc y / o bash_profile y rutas. Entonces, si escribe algo así sudo mount /mnt/some_folder, debería completarse automáticamente. Tal vez cuando hiciste el umountestabas en un camino relativo para tu destino y se completó automáticamente.

Patkos Csaba
fuente
Gracias. Estoy seguro de que el autocompletado no funciona sudo mount /mnt/some_folder, 100% seguro. AFAIK tampoco funciona en Arch Linux. Cuando hice el umountno estaba en la ruta relativa para el destino.
Ali
-1

Supongo que bash no quiere ser demasiado complejo y mantenerse portátil, por lo que no buscarán en / dev para proponer la finalización de una operación de montaje.

Sin embargo, al llamar a umount, puede ver fácilmente la salida de df / mount / etc. para saber qué dispositivos están montados y dónde.

Tal vez zsh proporcionará la finalización para el montaje, diablos zsh incluso autocompletará al hacer un comando scp ...

Aki
fuente
El archivo que estoy tratando de montar es un archivo iso en mi directorio de inicio. La finalización no funciona. Oh, lo he olvidado, completar con el trabajo de montaje si no uso el sudo. Es el sudo que lo rompe. ¿Alguna idea?
Ali
¿Incluso usando rutas absolutas? / home / user / myiso <TAB> -> myisofile.iso. depurar con sudo echo $ SHELL; sudo pwd, con suerte te dará algunas ideas.
Aki
Sí, con caminos absolutos. Probaré la depuración que sugieras. La depuración que sugiere se obtiene /bin/bash /home/alicomo se esperaba.
Ali