Làm thế nào để có được bash để thoát $ trong khi hoàn thành tab?


38

Tôi có cái này trên dòng lệnh:

ln -sf $PWD/wine-

và sau đó tôi nhấn Tabđể hoàn thành tên tệp. Trong các phiên bản trước của Ubuntu, điều này chỉ hoạt động tốt để hoàn thành wine-tên tệp (và vì hiệu ứng phụ $PWDsẽ được mở rộng tại thời điểm đó). Nhưng bây giờ nó biến nó thành

ln -sf \$PWD/wine-

đó không phải là ý tôi và không hoàn thành bất cứ điều gì vì tập tin không thực sự bắt đầu với $.

Làm thế nào để tôi hoàn thành trở lại hành vi ít bị phá vỡ?

set cho tôi biết đây là những cài đặt hiện tại của tôi:

BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor

2
Nếu bạn đang bị ảnh hưởng bởi lỗi này xin vui lòng xem xét bỏ phiếu dưới sự url sau (yêu cầu đăng nhập): bugs.launchpad.net/ubuntu/+source/bash/+bug/778627/...
cripton

Câu trả lời:


36

Tôi đã thấy rằng các phiên bản bash> = 4.2,29direxpandcài đặt shopt mới . (Xem man docs/bash.1nếu bạn xem bash mới, hoặc xem bash.1 từ dòng 8951 )

Nếu một người sử dụng Quantal Quetzal 12.10 hoặc bằng cách khác nắm giữ (hoặc kiểm tra và xây dựng) một bash mới, thì:

shopt -s direxpand

Cung cấp cho tôi hành vi tôi muốn, cần và yêu.

Giải pháp thay thế: Trong khi đó, Ctrl+ Alt+ Ethay vì Tablàm những gì tôi muốn quá. Nhưng là vụng về.

BTW, Có một số chủ đề được gọi là "câu hỏi mở rộng biến bash tab?" trong gnu.bash.orms . Từ việc đọc chúng, tôi tìm thấy thông tin ở đây.


2
một phiên bản của bash với direxpand được thực hiện theo cách của mình vào chính xác (12.04): Xem bugs.launchpad.net/bugs/778627
keturn

7
Sẽ tốt hơn nữa nếu tôi không mở rộng đường dẫn lớn của mình và có thể tiếp tục sử dụng biến không thoát khi hoàn thành.
jozxyqk

@jozxyqk Bạn đã bao giờ tìm cách để có được tính năng không mở rộng đường dẫn đó chưa?
Ungeheuer

@Ungeheuer Tôi hiện đang sử dụng bash 4.4.19trên Ubuntu 18.04 và nó chỉ hoạt động. Không chắc chắn khi điều này thay đổi.
jozxyqk

2

tìm kiếm _filedir()trong tập lệnh bash_completion cấp cao nhất và thay đổi dòng

compopt -o filenames 2>/dev/null

đến

compopt -o filenames -o noquote 2>/dev/null

Trong 12.04 GNU bash, phiên bản 4.2.25, đề xuất này đưa ra lỗi:compopt: noquote: invalid option name
thân

1

Đối với những người (như tôi) với 12.04 có thể sử dụng ~ + thay vì $ PWD ...

ví dụ :

cd /bin
echo ~+/ls
/bin/ls

1

Ngay cả với bash được cập nhật, tôi $vẫn thấy vẫn thoát được.

  • Gỡ bỏ bash-completion (1:2.1-3.fc20)gói
  • hoặc đơn giản là không tìm nguồn cung ứng /etc/bashrctừ ~/.bashrcdường như để sửa nó.

Tôi nghi ngờ bây giờ tôi sẽ thiếu một số tính năng mà tôi thường sử dụng nhưng chưa nhận thấy bất kỳ tính năng nào.


Thay thế (ít nhất là cho Fedora 26), thêm export BASH_COMPLETION_VERSINFO=0trước khi tìm nguồn cung ứng /etc/bashrc. Điều này làm cho kịch bản có vấn đề nghĩ rằng nó đã có nguồn gốc.



0

Vô hiệu hóa tùy chọn shell 'Complete_fullquote' thực hiện công việc:

shopt -u complete_fullquote

$ shopt -u Complete_fullquote -bash: shopt: Complete_fullquote: tên tùy chọn shell không hợp lệ
Anton Gorev

0
shopt -u progcomp

Điều này đã khắc phục nó cho tôi, nó cũng loại bỏ rất nhiều tùy chọn hoàn thành "thông minh" mà tôi đã tìm thấy bằng cách không hoàn thành các tệp mà tôi biết là có vì điều ngu ngốc nghĩ rằng tôi không muốn chúng là đối số cụ thể chỉ huy. ARRRG

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.