Làm thế nào để loại bỏ một đường dẫn từ biến $ PATH trong cá?


20

Tôi đang sử dụng cá làm vỏ của mình trong Debian và gần đây (sau khi nâng cấp) bất cứ khi nào tôi cố gắng sử dụng hoàn thành lệnh tôi có:

set: No such file or directory
set: Could not add component /usr/lib/x86_64-linux-gnu/libfm to PATH.
set: No such file or directory

Chạy này:

echo $PATH 

Cung cấp cho tôi điều này:

/usr/lib/x86_64-linux-gnu/libfm /usr/local/bin /usr/bin /bin /usr/local/games /usr/games

Trong hệ thống của tôi không có /usr/lib/x86_64-linux-gnu/libfm, vì vậy tôi hiểu tại sao cá phàn nàn, nhưng tôi không thể tìm cách loại bỏ đường dẫn này khỏi $PATHbiến của mình .

Có ai biết làm thế nào tôi có thể làm điều này?


grep -R /usr/lib/x86_64-linux-gnu/libfm ~/.config/fish /usr/share/fish??
glenn jackman

$ grep -R / usr / lib / x86_64-linux-gnu / libfm ~ / .config / fish / usr / share / fish /home/superuser/.config/fish/fish_history:grep -R / usr / lib / x86_64- linux-gnu / libfm ~ / .config / fish / usr / share / fish
tomekK

Câu trả lời:


33

Cách 'cá' thiết lập biến $ PATH là thực sự sử dụng set --universal fish_user_paths $fish_user_paths /new/path/here. Sau đó, $ fish_user_paths thực sự được thêm vào biến $ PATH khi một phiên mới bắt đầu. Tài liệu $ PATH hiện không cho bạn biết cách xóa nó.

Trong cá, mỗi biến thực sự là một danh sách (mảng) và bạn có thể truy cập trực tiếp từng mục một cách thuận tiện bằng cách sử dụng một chỉ mục / chỉ số. echo $fish_user_pathssẽ in ra một phiên bản giới hạn không gian của mỗi mục trong danh sách, tạo dòng mới bằng dấu cách với chức năng dịch echo $fish_user_paths | tr " " "\n"và sau đó đặt số dòng trên đó với chức năng số dòng , echo $fish_user_paths | tr " " "\n" | nl. Sau đó xóa nó với set --erase --universal fish_user_paths[5]. Bạn phải sử dụng --universalhoặc nó sẽ không hoạt động trong bất kỳ phiên mới.

Nếu ai đó có thời gian, xin vui lòng gửi PR cho repo với ví dụ này. Tôi đã mở một vấn đề ở đây .

tldr;

  1. echo $fish_user_paths | tr " " "\n" | nl // lấy số của cái bạn muốn xóa, ví dụ số thứ 5
  2. set --erase --universal fish_user_paths[5] // xóa đường dẫn thứ 5 trên toàn cầu để nó tồn tại trong các phiên mới

Tại sao điều này rất phức tạp? Đây có phải là một tính năng tích hợp và được thêm vào tài liệu để mọi người không phải truy cập Google và kết thúc tại đây không? Ồ tốt ..
Pär Nils Amsen

Tôi nghĩ rằng nếu chúng ta lấy câu trả lời của @ clozach ở đây superuser.com/a/1212305/30982 , đó là hàm addpaths () và removepath () và mở PR thì đó sẽ là bước đầu tiên để thêm nó. Hầu hết các nhân viên bảo trì đều làm việc khá tốt, một người có vẻ khó chịu với tôi, nhưng nhìn chung tôi nghĩ chúng ta sẽ có cơ hội tốt. Vì vậy, đó là bước tiếp theo của chúng tôi.
Elijah Lynn

9

Như Elijah nói, thực tiễn tốt nhất là sửa đổi fish_user_pathschứ không phải toàn cầu PATH. Để tránh phải Google một lần nữa

  1. Tạo một vài hàm chỉ sửa đổifish_user_paths
  2. Làm cho cả hai chức năng tự động tải

Để thêm vào đường dẫn người dùng:

function addpaths
    contains -- $argv $fish_user_paths
       or set -U fish_user_paths $fish_user_paths $argv
    echo "Updated PATH: $PATH"
end

Để xóa đường dẫn người dùng nếu nó tồn tại (tín dụng một phần cho điều này ):

function removepath
    if set -l index (contains -i $argv[1] $PATH)
        set --erase --universal fish_user_paths[$index]
        echo "Updated PATH: $PATH"
    else
        echo "$argv[1] not found in PATH: $PATH"
    end
end

Và tất nhiên, để làm cho chúng tự động tải :

funcsave addpaths; funcsave removepath

Cách sử dụng ví dụ:

> addpaths /etc /usr/libexec
Modifying PATH: /usr/local/bin /usr/bin /bin /usr/sbin /sbin
Updated PATH: /etc /usr/libexec /usr/local/bin /usr/bin /bin /usr/sbin /sbin

> removepath /usr/libexec
Modifying PATH: /etc /usr/libexec /usr/local/bin /usr/bin /bin /usr/sbin /sbin
Updated PATH: /etc /usr/local/bin /usr/bin /bin /usr/sbin /sbin

Lưu ý: Tôi vừa phát hiện ra rằng phương pháp này sẽ không xóa một đường dẫn được thêm vào thông qua một số cơ chế khác; Một số dọn dẹp tệp chấm có thể theo thứ tự nếu bạn tìm thấy một đường dẫn trở lại mỗi khi bạn mở một phiên cuối mới.
clozach

Điều này là tuyệt vời, chỉ cần thêm vào địa phương của tôi!
Elijah Lynn

3

Điều này sẽ xóa các đường dẫn 6 thông qua đường dẫn cuối cùng:

set -e PATH[6..-1]

Cờ -e bị xóa. Xem help set.


điều này sẽ chỉ hoạt động cho phiên hiện tại
Daniel
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.