Bashパス補完はsudoでどのように機能しますか?


11

タブパスの補完が機能しない(少なくともUbuntuおよびAFAIK Archでは)

sudo mount <whatever>

マウントしようとしているISOファイルがにありません/etc/fstab。入力するだけで

mount <whatever>

補完が機能します(ただし、ルートではないため、コマンドは失敗します)。どうやらそれsudoを壊すのです。

sudoで補完を機能させるにはどうすればよいですか?

それは驚くべきことです

sudo umount <whatever>

完成作品。それはどのように達成されますか?調べます/etc/fstabか?

解決策:渡された引数を使用して、/usr/local/binその呼び出しにシェルスクリプトを挿入しますsudo mount ...sudo邪魔はないので、このスクリプトを呼び出すと補完が機能します。

回答:


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_completionmountumountコマンドとコマンドについて明示的に説明している次のコメントがあります。

# 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キーを2回押す)があると便利ですsudo

これを行うには、次の形式の行を~/.bashrcファイルに追加します。

完全な-cf your_command

例えば、オートコンプリートの後を有効にするsudoman

complete -cf sudo
complete -cf man

ありがとう。の場合、オートコンプリートは驚くほどうまく機能することに注意してくださいsudo umount。enzotibが指摘するように、この機能はで壊れてmountおり、前回チェックしたところ、Archでも壊れていました。
アリ

私はこれをArchで試したところ/etc/fstab、/ mediaで始まるsudoマウント/ me <TAB>が、構成した唯一のパスに完了しました。
ヴィーランド

私の場合、私がマウントしようとしているファイルがあるない/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はマウントの完了を提供します、scpコマンドを実行するときにzshはオートコンプリートさえも提供します...


マウントしようとしているファイルは、ホームディレクトリのisoファイルです。補完が機能しません。ああ、sudoを使わなければマウント作業での完了を忘れてしまいました。それを壊すのはsudoです。何かご意見は?
アリ

絶対パスを使用していますか?/ home / user / myiso <TAB>-> myisofile.iso。sudo echo $ SHELLでデバッグします。sudo pwd、うまくいけば、いくつかの洞察が得られます。
アキ

はい、絶対パスを使用します。あなたが提案したデバッグを試します。あなたが提案するデバッグは/bin/bash /home/ali期待通りに与えます。
アリ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.