Bagaimana cara penyelesaian jalur Bash bekerja dengan sudo?

11

Penyelesaian jalur tab tidak berfungsi (setidaknya di Ubuntu dan AFAIK Arch) dengan

sudo mount <whatever>

File iso yang saya coba pasang tidak ada di /etc/fstab. Jika saya mengetik saja

mount <whatever>

penyelesaian berfungsi (tapi tentu saja perintah gagal karena saya tidak root). Rupanya sudoyang merusaknya.

Bagaimana cara menyelesaikan pekerjaan dengan sudo?

Sangat mengejutkan bahwa dengan

sudo umount <whatever>

pekerjaan penyelesaian. Bagaimana itu dicapai? Apakah itu melihat /etc/fstab?

Solusi: Saya hanya memasukkan skrip shell ke dalam /usr/local/binpanggilan sudo mount ...dengan argumen yang diteruskan ke sana. Penyelesaian berfungsi saat memanggil skrip ini karena tidak ada sudoyang menghalangi.

Ali
sumber

Jawaban:

11

Ini sama sekali tidak ada hubungannya bash, tetapi itu tergantung pada penyelesaian yang diprogram dalam paket bash-completion.

Dari beberapa komentar di file /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)
#

Juga, Anda menemukan di file utama /etc/bash_completionkomentar berikut, yang secara eksplisit berbicara tentang mountdan umountmemerintahkan:

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

Pembaruan :
Komentar tentang mountdan umountperintah dihapus dari bash_completion di komit :

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

Dirilis padabash-completion 1.90

enzotib
sumber
4

Ini dapat dengan mudah diselesaikan dengan melihat ke Arch Wiki :

Sangat berguna untuk memiliki fitur pelengkapan otomatis (menekan tombol Tab dua kali pada keyboard) setelah Anda mengetik beberapa perintah seperti sudo.

Untuk melakukan ini, tambahkan baris dalam format ini ke ~/.bashrcfile Anda :

lengkapi -cf your_command

Misalnya, untuk mengaktifkan pelengkapan otomatis setelah sudodan man:

complete -cf sudo
complete -cf man
Wieland
sumber
Terima kasih. Harap perhatikan bahwa pelengkapan otomatis bekerja dengan sangat baik jika terjadi sudo umount. Seperti yang ditunjukkan enzotib, fitur ini rusak mountdan terakhir kali saya memeriksa, itu juga rusak di Arch.
Ali
Saya baru saja mencoba ini di Arch dan sudo mount / me <TAB> melengkapi satu-satunya jalur yang telah saya konfigurasikan /etc/fstabyang dimulai dengan / media.
Wieland
Dalam kasus saya, file saya mencoba untuk me-mount adalah tidak di /etc/fstab. Bisakah anda memeriksa ini?
Ali
0

Tidak, itu tidak terlihat di fstab. Penyelesaian Bash mencari perintah di path, alias di bashrc dan / atau bash_profile dan paths. Jadi, jika Anda mengetikkan sesuatu seperti sudo mount /mnt/some_folderitu, lengkapi-otomatis. Mungkin ketika Anda melakukannya, umountAnda berada di jalur relatif untuk tujuan Anda dan melakukan pelengkapan otomatis.

Patkos Csaba
sumber
Terima kasih. Saya yakin pelengkapan otomatis tidak berfungsi sudo mount /mnt/some_folder, 100% yakin. AFAIK juga tidak bekerja di Arch Linux. Ketika saya melakukannya umountsaya tidak berada di jalur relatif untuk tujuan.
Ali
-1

Saya kira bash tidak ingin menjadi terlalu kompleks dan tetap portabel, sehingga mereka tidak akan mencari / dev untuk mengusulkan penyelesaian untuk operasi mount.

Namun saat memanggil umount, ia dapat dengan mudah melihat output dari df / mount / etc untuk mengetahui perangkat apa yang dipasang dan di mana.

Mungkin zsh akan memberikan penyelesaian untuk mount, heck bahkan zsh autocomplete ketika melakukan perintah scp ...

Aki
sumber
File yang saya coba mount adalah file iso di direktori home saya. Penyelesaian tidak berhasil. Oh, saya sudah lupa, selesai dengan mount work jika saya tidak menggunakan sudo. Itu adalah sudo yang merusaknya. Adakah pikiran?
Ali
Bahkan menggunakan jalur absolut? / home / user / myiso <TAB> -> myisofile.iso. debug dengan sudo echo $ SHELL; sudo pwd, semoga saja ini memberi Anda wawasan.
Aki
Ya, dengan jalur absolut. Saya akan mencoba debug yang Anda sarankan. Debugging yang Anda sarankan berikan /bin/bash /home/aliseperti yang diharapkan.
Ali