Bash yolunun tamamlanması sudo ile nasıl çalışır?


11

Sekme yolunun tamamlanması çalışmıyor (en azından Ubuntu ve AFAIK Arch'da)

sudo mount <whatever>

Bağlamaya çalıştığım iso dosyası içinde değil /etc/fstab. Sadece yazarsam

mount <whatever>

tamamlama çalışır (ama ben kök olmadığım için komut başarısız olur). Görünüşe göre bu onu sudokırıyor.

Tamamlama sudo ile nasıl çalışır?

Şaşırtıcı

sudo umount <whatever>

tamamlama işleri. Nasıl başarılır? İçine bakıyor /etc/fstabmu?

Çözüm:/usr/local/bin Bu çağrılara sudo mount ..., kendisine aktarılan argümanlarla bir kabuk betiği koydum . Tamamlama, bu komut dosyasını çağırırken, hiçbir sudoşekilde olmadığı için çalışır .

Yanıtlar:


11

Bunun hiç ilgisi yoktur bash, ancak pakette programlanan tamamlamalara bağlıdır bash-completion.

Dosyadaki bazı yorumlardan /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)
#

Ayrıca, ana dosyada /etc/bash_completionaçıkça hakkında konuşulan mountve umountkomutları içeren aşağıdaki yorumu bulabilirsiniz :

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

Güncelleme :
yaklaşık açıklama mountve umountgelen komutları kaldırıldı bash_completion içinde taahhüt :

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

Çıkış içindebash-completion 1.90


4

Bu, Arch Wiki'ye bakarak kolayca çözülebilir :

Gibi bir komut yazdıktan sonra otomatik tamamlama özelliğinin (klavyede Sekme tuşuna iki kez basılarak) sahip olması yararlıdır sudo.

Bunu yapmak için ~/.bashrcdosyanıza bu biçimde satır ekleyin :

complete -cf your_command

Örneğin, otomatik tamamladıktan sonra etkinleştirme sudove man:

complete -cf sudo
complete -cf man

Teşekkürler. Otomatik tamamlamanın şaşırtıcı bir şekilde iyi çalıştığını lütfen unutmayın sudo umount. Enzotibin işaret ettiği gibi, bu özellik kırıldı mountve son kontrol ettiğimde Arch'de de kırıldı.
Ali

Ben sadece bu Arch denedim ve sudo mount / me <TAB> /etc/fstab/ media ile başlayan yapılandırdığım tek yolu tamamlar .
Wieland

Benim durumumda, monte etmeye çalıştığım dosya içinde değil/etc/fstab . Bunu kontrol edebilir misiniz?
Ali

0

Hayır, fstab'da görünmüyor. Bash tamamlama, yoldaki komutları, bashrc ve / veya bash_profile'daki diğer yolları ve yolları arar. Yani böyle bir şey yazarsanız sudo mount /mnt/some_folderotomatik olarak tamamlanmalıdır. Belki bunu yaptığınızda, umounthedefiniz için göreceli bir yoldaydınız ve bu otomatik tamamlama yaptı.


Teşekkürler. Eminim otomatik tamamlama işe yaramaz sudo mount /mnt/some_folder,% 100 emin. AFAIK, Arch Linux üzerinde de çalışmaz. Bunu yaptığımda umounthedefin göreli yolunda değildim.
Ali

-1

Sanırım bash çok karmaşık ve taşınabilir kalmak istemiyor, bu yüzden bir montaj işlemi için tamamlama önermek için / dev'e bakmayacaklar.

Ancak umount çağrıldığında, hangi cihazların nereye monte edildiğini bilmek için df / mount / etc çıktısına kolayca bakabilir.

Belki zsh bir scp komutu yaparken mount, heck zsh bile autocomplete için tamamlama sağlayacaktır ...


Bağlamaya çalıştığım dosya ana dizinimdeki bir iso dosyası. Tamamlama çalışmıyor. Oh, sudo kullanmazsam montaj işini tamamlamayı unuttum. Onu kıran sudo. Düşüncesi olan var mı?
Ali

Mutlak yollar bile kullanıyor musunuz? / ana sayfa / kullanıcı / myiso <TAB> -> myisofile.iso. sudo echo $ SHELL ile hata ayıklama; sudo pwd, umarım size bazı bilgiler verir.
Aki

Evet, mutlak yollarla. Önerdiğiniz hata ayıklamayı deneyeceğim. Önerdiğiniz hata ayıklama /bin/bash /home/alibeklendiği gibi verilir.
Ali
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.