Làm thế nào để hoàn thành đường dẫn Bash làm việc với sudo?


11

Hoàn thành đường dẫn tab không hoạt động (ít nhất là trên Ubuntu và AFAIK Arch) với

sudo mount <whatever>

Tệp iso tôi đang cố gắn kết không có trong /etc/fstab. Nếu tôi chỉ gõ

mount <whatever>

hoàn thành công việc (nhưng tất nhiên lệnh thất bại vì tôi không root). Rõ ràng là nó sudophá vỡ nó.

Làm thế nào có thể làm cho hoàn thành công việc với sudo?

Thật đáng ngạc nhiên khi với

sudo umount <whatever>

hoàn thành công trình. Làm thế nào nó đạt được? Nó nhìn vào /etc/fstab?

Giải pháp: Tôi chỉ cần đặt một tập lệnh shell vào /usr/local/bincác cuộc gọi đó sudo mount ...với các đối số được truyền cho nó. Hoàn thành hoạt động khi gọi kịch bản này vì không có sudocách nào.

Câu trả lời:


11

Điều này hoàn toàn không liên quan bash, nhưng nó phụ thuộc vào sự hoàn thành được lập trình trong gói bash-completion.

Từ một số ý kiến ​​trong tập tin /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)
#

Ngoài ra, bạn tìm thấy trong tệp chính /etc/bash_completionnhận xét sau, nói rõ ràng về các lệnh mountumountlệnh:

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

Cập nhật :
Nhận xét về mountumountcác lệnh đã bị xóa khỏi bash_completion trong cam kế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.

Phát hành trongbash-completion 1.90


4

Điều này có thể dễ dàng được giải quyết bằng cách xem xét Arch Wiki :

Sẽ rất hữu ích khi có tính năng tự động hoàn thành (nhấn phím Tab hai lần trên bàn phím) sau khi bạn nhập một số lệnh như thế nào sudo.

Để thực hiện việc này, hãy thêm (các) dòng ở định dạng này vào ~/.bashrctệp của bạn :

hoàn thành -cf your_command

Ví dụ: để bật tự động hoàn thành sau sudoman:

complete -cf sudo
complete -cf man

Cảm ơn. Xin lưu ý rằng tự động hoàn thành hoạt động tốt đáng ngạc nhiên trong trường hợp sudo umount. Như enzotib chỉ ra, tính năng này đã bị hỏng mountvà lần trước tôi đã kiểm tra, nó cũng bị hỏng trên Arch.
Ali

Tôi vừa thử điều này trên Arch và sudo mount / me <TAB> hoàn thành đường dẫn duy nhất tôi đã cấu hình /etc/fstabbắt đầu bằng / media.
Wieland

Trong trường hợp của tôi, tập tin tôi đang cố gắn kết không có trong đó /etc/fstab. Bạn có thể vui lòng kiểm tra điều này?
Ali

0

Không, nó không nhìn vào fstab. Hoàn thành Bash tìm kiếm các lệnh trong đường dẫn, bí danh trong bashrc và / hoặc bash_profile và đường dẫn. Vì vậy, nếu bạn gõ một cái gì đó như sudo mount /mnt/some_foldernó sẽ tự động hoàn thành. Có thể khi bạn thực hiện, umountbạn đã ở trong một đường dẫn tương đối cho điểm đến của mình và nó đã tự động hoàn thành.


Cảm ơn. Tôi chắc chắn tự động hoàn thành không hoạt động sudo mount /mnt/some_folder, chắc chắn 100%. AFAIK nó cũng không hoạt động trên Arch Linux. Khi tôi làm điều đó umounttôi không ở trong đường dẫn tương đối cho đích đến.
Ali

-1

Tôi đoán bash không muốn quá phức tạp và vẫn có thể di động, vì vậy họ sẽ không tìm trong / dev để đề xuất hoàn thành cho một hoạt động gắn kết.

Tuy nhiên, khi gọi umount, nó có thể dễ dàng xem đầu ra của df / mount / etc để biết thiết bị nào được gắn và ở đâu.

Có thể zsh sẽ cung cấp hoàn thành cho mount, heck zsh thậm chí tự động hoàn thành khi thực hiện lệnh scp ...


Tệp tôi đang cố gắn kết là một tệp iso trong thư mục nhà của tôi. Việc hoàn thành không hoạt động. Ồ, tôi đã quên, hoàn thành với công việc gắn kết nếu tôi không sử dụng sudo. Đó là sudo phá vỡ nó. Có suy nghĩ gì không?
Ali

Ngay cả sử dụng đường dẫn tuyệt đối? / nhà / người dùng / myiso <TAB> -> myisofile.iso. gỡ lỗi với sudo echo $ SHELL; sudo pwd, hy vọng nó sẽ cung cấp cho bạn một số hiểu biết.
Aki

Vâng, với những con đường tuyệt đối. Tôi sẽ thử gỡ lỗi bạn đề nghị. Việc gỡ lỗi mà bạn đề xuất đưa ra /bin/bash /home/alinhư mong đợi.
Ali
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.