Comment fonctionne l'achèvement du chemin Bash avec sudo?


11

La complétion du chemin de tabulation ne fonctionne pas (au moins sur Ubuntu et AFAIK Arch) avec

sudo mount <whatever>

Le fichier ISO que j'essaye de monter n'est pas dans /etc/fstab. Si je tape juste

mount <whatever>

l'achèvement fonctionne (mais bien sûr la commande échoue car je ne suis pas root). Apparemment, c'est ça sudoqui le brise.

Comment faire fonctionner la complétion avec sudo?

Il est surprenant qu’avec

sudo umount <whatever>

travaux d'achèvement. Comment est-il réalisé? Regarde-t-il /etc/fstab?

Solution: Je viens de mettre un script shell dans /usr/local/binces appels sudo mount ...avec les arguments qui lui sont passés. L'achèvement fonctionne lors de l'appel de ce script car il n'y a aucun sudoobstacle.

Réponses:


11

Cela n'a rien à voir avec cela bash, mais cela dépend des compléments programmés dans le package bash-completion.

De quelques commentaires dans le fichier /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)
#

En outre, vous trouverez dans le fichier principal /etc/bash_completionle commentaire suivant, qui parle explicitement de mountet de umountcommandes:

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

Mise à jour :
le commentaire sur mountet les umountcommandes ont été supprimés de bash_completion la validation :

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

Sorti enbash-completion 1.90


4

Cela peut être facilement résolu en consultant le Wiki Arch :

Il est utile d'avoir la fonction de saisie semi-automatique (en appuyant deux fois sur la touche Tab du clavier) après avoir tapé une commande comme sudo.

Pour ce faire, ajoutez des lignes de ce format à votre ~/.bashrcfichier:

complete -cf your_command

Par exemple, pour activer la saisie semi-automatique après sudoet man:

complete -cf sudo
complete -cf man

Merci. Veuillez noter que la saisie semi-automatique fonctionne étonnamment bien en cas de sudo umount. Comme le souligne enzotib, cette fonctionnalité est rompue avec mountet la dernière fois que j'ai vérifié, elle était également cassée sur Arch.
Ali

Je viens d'essayer cela sur Arch et sudo mount / me <TAB> se termine sur le seul chemin que j'ai configuré dans /etc/fstabqui commence par / media.
Wieland

Dans mon cas, le fichier que je suis en train de monter est pas dans /etc/fstab. Pouvez-vous vérifier cela s'il vous plaît?
Ali

0

Non, il ne semble pas dans fstab. La complétion de Bash recherche les commandes dans path, les alias dans bashrc et / ou bash_profile et les chemins. Donc, si vous tapez quelque chose comme sudo mount /mnt/some_folderça, il devrait se compléter automatiquement. Peut-être que lorsque vous l'avez fait, umountvous étiez dans un chemin relatif pour votre destination et il a effectué une auto-complétion.


Merci. Je suis sûr que la saisie semi-automatique ne fonctionne pas pour sudo mount /mnt/some_folder, 100% sûr. AFAIK ça ne marche pas non plus sur Arch Linux. Quand je l' umountai fait, je n'étais pas sur le chemin relatif de la destination.
Ali

-1

Je suppose que bash ne veut pas être trop complexe et rester portable, donc ils ne chercheront pas dans / dev pour proposer l'achèvement d'une opération de montage.

Cependant, lors de l'appel à umount, il peut facilement regarder la sortie de df / mount / etc pour savoir quels périphériques sont montés et où.

Peut-être que zsh fournira l'achèvement du montage, zeck zsh même la saisie semi-automatique lors de l'exécution d'une commande scp ...


Le fichier que j'essaye de monter est un fichier iso dans mon répertoire personnel. L'achèvement ne fonctionne pas. Oh, j'ai oublié, achèvement avec montage si je n'utilise pas le sudo. C'est le sudo qui le casse. Des pensées?
Ali

Même en utilisant des chemins absolus? / home / user / myiso <TAB> -> myisofile.iso. débogage avec sudo echo $ SHELL; sudo pwd, j'espère que cela vous donnera un aperçu.
Aki

Oui, avec des chemins absolus. Je vais essayer le débogage que vous proposez. Le débogage que vous proposez donne /bin/bash /home/alicomme prévu.
Ali
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.