Wie funktioniert die Vervollständigung des Bash-Pfads mit sudo?

11

Die Vervollständigung des Tab-Pfads funktioniert nicht (zumindest unter Ubuntu und AFAIK Arch) mit

sudo mount <whatever>

Die ISO-Datei, die ich zu mounten versuche, befindet sich nicht in /etc/fstab. Wenn ich nur tippe

mount <whatever>

Die Fertigstellung funktioniert (aber natürlich schlägt der Befehl fehl, da ich nicht root bin). Anscheinend ist es das sudo, was es bricht.

Wie kann die Fertigstellung mit sudo funktionieren?

Es ist überraschend, dass mit

sudo umount <whatever>

Fertigstellung funktioniert. Wie wird es erreicht? Schaut es in /etc/fstab?

Lösung: Ich habe nur ein Shell-Skript in /usr/local/bindiese Aufrufe sudo mount ...mit den übergebenen Argumenten eingefügt. Die Vervollständigung funktioniert beim Aufrufen dieses Skripts, da keine sudoim Weg ist.

Ali
quelle

Antworten:

11

Dies hat überhaupt nichts damit zu tun bash, hängt jedoch von den im Paket programmierten Vervollständigungen ab bash-completion.

Aus einigen Kommentaren in der Datei /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)
#

Außerdem finden Sie in der Hauptdatei /etc/bash_completionden folgenden Kommentar, über den explizit gesprochen wird, mountund umountBefehle:

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

Update :
Der Kommentar zu mountund die umountBefehle wurden bash_completion im Commit entfernt :

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

Veröffentlicht inbash-completion 1.90

Enzotib
quelle
4

Dies kann leicht durch einen Blick in das Arch Wiki gelöst werden :

Es ist nützlich, die automatische Vervollständigung zu haben (zweimaliges Drücken der Tabulatortaste auf der Tastatur), nachdem Sie einen Befehl wie eingegeben haben sudo.

Fügen Sie dazu Ihrer ~/.bashrcDatei Zeilen in diesem Format hinzu :

Vervollständigen Sie -cf your_command

So aktivieren Sie beispielsweise die automatische Vervollständigung nach sudound man:

complete -cf sudo
complete -cf man
Wieland
quelle
Vielen Dank. Bitte beachten Sie, dass die automatische Vervollständigung im Fall von überraschend gut funktioniert sudo umount. Wie Enzotib hervorhebt, ist diese Funktion defekt mountund als ich sie das letzte Mal überprüft habe, war sie auch bei Arch defekt.
Ali
Ich habe dies gerade auf Arch versucht und sudo mount / me <TAB> vervollständigt den einzigen Pfad, den ich konfiguriert /etc/fstabhabe und der mit / media beginnt.
Wieland
In meinem Fall befindet sich die Datei, die ich zu mounten versuche, nicht in /etc/fstab. Könnten Sie das bitte überprüfen?
Ali
0

Nein, es sieht nicht in fstab aus. Die Bash-Vervollständigung sucht nach Befehlen im Pfad, Aliasnamen in bashrc und / oder bash_profile und Pfaden. Wenn Sie also so etwas eingeben sudo mount /mnt/some_folder, sollte es automatisch vervollständigt werden. Als Sie das getan haben umount, befanden Sie sich möglicherweise auf einem relativen Pfad für Ihr Ziel und es wurde automatisch vervollständigt.

Patkos Csaba
quelle
Vielen Dank. Ich bin sicher, dass die automatische Vervollständigung nicht funktioniert sudo mount /mnt/some_folder, 100% sicher. AFAIK funktioniert auch unter Arch Linux nicht. Als ich das tat, war umountich nicht auf dem relativen Pfad für das Ziel.
Ali
-1

Ich denke, bash möchte nicht zu komplex sein und portabel bleiben, also werden sie nicht in / dev schauen, um die Fertigstellung für eine Mount-Operation vorzuschlagen.

Beim Aufrufen von umount kann jedoch die Ausgabe von df / mount / etc leicht überprüft werden, um festzustellen, welche Geräte wo gemountet sind.

Vielleicht wird zsh die Vervollständigung für das Mounten bereitstellen, zsh sogar automatisch vervollständigen, wenn ein scp-Befehl ausgeführt wird ...

Aki
quelle
Die Datei, die ich zu mounten versuche, ist eine ISO-Datei in meinem Home-Verzeichnis. Die Fertigstellung funktioniert nicht. Oh, ich habe vergessen, Abschluss mit Mount-Arbeiten, wenn ich den Sudo nicht benutze. Es ist der Sudo, der es bricht. Irgendwelche Gedanken?
Ali
Auch absolute Pfade benutzen? / home / user / myiso <TAB> -> myisofile.iso. Debuggen mit Sudo Echo $ SHELL; sudo pwd, hoffentlich gibt es dir ein paar einblicke.
Aki
Ja, mit absoluten Pfaden. Ich werde das von Ihnen vorgeschlagene Debugging versuchen. Das von Ihnen vorgeschlagene Debugging ist /bin/bash /home/alierwartungsgemäß.
Ali