Bash路径补全如何与sudo一起使用?


11

制表符路径补全不适用于(至少在Ubuntu和AFAIK Arch上)与

sudo mount <whatever>

我尝试挂载的iso文件不在中/etc/fstab。如果我只是输入

mount <whatever>

完成工作正常(但命令失败,因为我不是root用户)。显然是sudo打破了它。

如何使sudo完成工作?

令人惊讶的是

sudo umount <whatever>

完成工程。如何实现的?会调查/etc/fstab吗?

解决方案:我只是将一个shell脚本放入传递了参数的/usr/local/bin调用中sudo mount ...。调用此脚本时,完成是可行的,因为这样做不会成功sudo

Answers:


11

bash一点无关紧要,但这取决于程序包中编程的完成bash-completion

从文件中的一些注释中/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)
#

此外,您还可以在主文件中找到/etc/bash_completion以下注释,这些注释显式地讨论mountumount命令:

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

更新
有关的评论mountumount取出命令,从bash_completion提交

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

发布bash-completion 1.90


4

这可以通过查看Arch Wiki轻松解决:

键入某些命令后,具有自动完成功能(两次按键盘上的Tab键)很有用sudo

为此,请将以下格式的行添加到~/.bashrc文件中:

完成-cf your_command

例如,要在sudo和之后启用自动完成功能man

complete -cf sudo
complete -cf man

谢谢。请注意,在的情况下,自动完成功能效果非常好sudo umount。正如enzotib所指出的,此功能已被破坏,mount上次我检查时,它也已在Arch上被破坏。
阿里

我只是在Arch上尝试过此操作,而sudo mount / me <TAB>则完成了我配置的唯一/etc/fstab以/ media开头的路径。
Wieland

就我而言,我尝试挂载的文件不在/etc/fstab。你能检查一下吗?
阿里

0

不,它不在fstab中显示。Bash完成在路径中查找命令,在bashrc和/或bash_profile中查找别名和路径。因此,如果您输入类似的内容,sudo mount /mnt/some_folder它应该会自动完成。也许当您这样做时,umount您就在到达目的地的相对路径中,并且它会自动完成。


谢谢。我确定sudo mount /mnt/some_folder100%肯定不会使用自动完成功能。AFAIK在Arch Linux上也不起作用。当我这样做时,umount我不在目的地的相对路径中。
阿里

-1

我想bash并不想太复杂并且保持可移植性,所以他们不会在/ dev中寻找完成安装操作的建议。

但是,在调用umount时,可以轻松查看df / mount / etc的输出,以了解安装了哪些设备以及安装在何处。

也许zsh会提供安装的完成,而zcp甚至会在执行scp命令时自动完成...


我要挂载的文件是我的主目录中的iso文件。完成不起作用。哦,我已经忘记了,如果我不使用sudo,则需要完成安装工作。正是sudo打破了它。有什么想法吗?
阿里

即使使用绝对路径?/ home / user / myiso <TAB>-> myisofile.iso。使用sudo echo $ SHELL进行调试;sudo pwd,希望它将为您提供一些见识。
Aki 2012年

是的,具有绝对路径。我将尝试您建议的调试。您建议的调试/bin/bash /home/ali按预期进行。
阿里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.