Bash tự động hoàn thành cho các biến môi trường [đã đóng]


25

Tính năng tự động hoàn thành bash dường như không hoạt động với các biến môi trường trong 11.04. Hành vi hiện tại được chỉ ra dưới đây

export SCRIPT=/home/user/script
cd $SCRIPT/<tab>

dẫn đến dấu gạch chéo ngược ( \) được thêm vào trước đó, $SCRIPTtức là dấu nhắc trở thành

cd \$SCRIPT/

Điều tương tự xảy ra nếu cdđược thay thế bằng lshoặc bất kỳ lệnh nào khác

Ngoài ra, nếu có tệp thực thi trong đường dẫn có trong $ SCRIPT và tôi muốn chạy tệp đó

$SCRIPT/<tab>

Bash không hiển thị các tùy chọn bên trong thư mục (bất kể có một tệp hay nhiều tệp / thư mục bên trong đường dẫn có trong các biến môi trường).

Nói cách khác, tự động hoàn thành không hoạt động với các biến môi trường.



Tôi nghĩ rằng nó không phải làm với phiên bản bash (4.1 hoặc 4.2). Tôi vừa cài đặt bash-4.1 từ các nguồn và sử dụng nó thay vì 4.2.24 (phiên bản Ubuntu 12.04; được cài đặt từ các nguồn để tôi không phải 'giữ lại' gói trong mỗi lần nâng cấp hệ thống) và hành vi hoàn toàn giống nhau Rất, rất khó chịu ...

4
Câu hỏi này dường như lạc đề vì đó là về một lỗi trong bản phát hành cũ không được hỗ trợ. Lỗi này được mô tả ở đây và đã được sửa trong 12.04 và sau đó
Warren Hill

1
@WarrenHill Điều này có thể lạc đề vì đó là về một lỗi (và tôi đã bỏ phiếu để đóng nó vì lý do đó). Tuy nhiên, lỗi trong bản phát hành không được hỗ trợ là không liên quan - chúng tôi không đóng các câu hỏi cũ có câu trả lời ngoài chủ đề khi ngày EoL của bản phát hành bị ảnh hưởng xuất hiện. Chỉ những câu hỏi EoL mới / chưa được trả lời là lạc đề.
Eliah Kagan

Câu trả lời:


13

Lỗi này đã được giới thiệu trong bash 4.2. Có một chủ đề dài về nó ở đây:

http://lists.gnu.org/archive/html/orms-bash/2011-02/msg00274.html

Nói tóm lại, Chet Ramey, nhà phát triển bash, không biết phải sửa nó như thế nào.


Có cách nào để hoàn nguyên về bash 4.1 không?
nilchat

1
Một bản sửa lỗi đang được tiến hành: Chet đã thêm một shopt "direxpand" để khôi phục hành vi cũ. Nó chưa có trong Oneiric.
Nelson

8
Điều đáng ngạc nhiên với tôi là rất ít người phàn nàn về điều này. Đó là một thay đổi lớn từ cách bash đã hoạt động trong một số năm.
Scott C Wilson

11

Để lấy lại hành vi cũ, sử dụng lệnh

shopt -s direxpand

hoặc bao gồm nó trong của bạn .bashrc

Nếu bạn sử dụng cùng một .bashrc với các phiên bản bash khác nhau, hãy sử dụng

if ((BASH_VERSINFO[0] >= 4)) && ((BASH_VERSINFO[1] >= 2))
    then shopt -s direxpand
fi

1
Thử nghiệm đó sẽ thất bại đối với bash 5.0 và 5.1.
Keith Thompson

8

Cách giải quyết được đề xuất trong http://lists.gnu.org/archive/html/orms-bash/2011-02/msg00274.html là:

  1. sử dụng <Tab>để tự động hoàn thành biến môi trường của bạn st dòng lệnh bạn nóicd $MYVAR
  2. nhấn <Esc>+ <Ctrl>-Eđể mở rộng dòng lệnh hiện tại tức là thay thế $MYVARbằng giá trị của nó, đường dẫn
  3. thêm một /và sau đó tận hưởng <Tab>tự động hoàn thành như bình thường

Điều này giả sử bạn đang ở chế độ emacs ( set -o emacs) và đã bash_completionthiết lập hợp lý cho cd(ví dụ complete -o nospace -F _cd cd).

Thật không may, điều này không hoạt động trong chế độ vi ( set -o vi) vì mở rộng dòng lệnh không có sẵn sau đó.


2

Sau khi gõ biến shell

cd $SCRIPT/

loại Cntrl-Alt-E. Điều này mở rộng biến

cd /home/user/script/

Điều này không hoạt động với EDITOR = vi trong Fedora 16.

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.