Bagaimana cara menghapus path dari variabel $ PATH pada ikan?

20

Saya menggunakan ikan sebagai shell saya di Debian dan baru-baru ini (setelah beberapa upgrade) setiap kali saya mencoba menggunakan perintah yang saya miliki:

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

Menjalankan ini:

echo $PATH 

Memberi saya ini:

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

Dalam sistem saya tidak ada /usr/lib/x86_64-linux-gnu/libfm, jadi saya mengerti mengapa ikan mengeluh, tetapi saya tidak dapat menemukan cara menghapus jalur ini dari $PATHvariabel saya .

Adakah yang tahu bagaimana saya bisa melakukan ini?

tomekK
sumber
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

Jawaban:

33

Cara 'fish' untuk menetapkan variabel $ PATH adalah dengan benar-benar menggunakan set --universal fish_user_paths $fish_user_paths /new/path/here. Kemudian $ fish_user_paths sebenarnya ditambahkan ke variabel $ PATH ketika sesi baru dimulai. Dokumentasi $ PATH saat ini tidak memberi tahu Anda cara menghapusnya.

Dalam fish, setiap variabel sebenarnya adalah daftar (array), dan Anda dapat dengan mudah mengakses setiap item secara langsung dengan menggunakan indeks / indice. echo $fish_user_pathsakan mencetak versi yang dibatasi spasi dari setiap item dalam daftar, membuat spasi baris baru dengan fungsi terjemahan echo $fish_user_paths | tr " " "\n"dan kemudian meletakkan nomor baris di atasnya dengan fungsi baris angka echo $fish_user_paths | tr " " "\n" | nl,. Lalu hapus dengan set --erase --universal fish_user_paths[5]. Anda harus menggunakan --universalatau tidak akan bekerja di sesi baru apa pun.

Jika seseorang punya waktu, kirimkan PR ke repo dengan contoh ini. Saya membuka masalah di sini .

tldr;

  1. echo $fish_user_paths | tr " " "\n" | nl // dapatkan nomor yang ingin Anda hapus, mis. yang ke-5
  2. set --erase --universal fish_user_paths[5] // hapus jalur ke-5 secara universal sehingga tetap ada di sesi baru
Elijah Lynn
sumber
Mengapa ini begitu misterius? Tidakkah ini menjadi fitur bawaan dan ditambahkan ke dokumentasi sehingga orang tidak perlu ke Google dan berakhir di sini? Oh well ..
Pär Nils Amsen
Saya pikir jika kita mengambil jawaban @ clozach di sini superuser.com/a/1212305/30982 , yang merupakan fungsi addpaths () dan removeepath (), dan membuka PR maka itu akan menjadi langkah pertama untuk menambahkannya. Sebagian besar pemelihara cukup bagus untuk dikerjakan, seseorang tampaknya pemarah kepada saya, tetapi secara keseluruhan saya pikir kami akan memiliki peluang bagus. Jadi itu adalah langkah kita selanjutnya.
Elijah Lynn
9

Seperti yang dikatakan Elia, praktik terbaik adalah memodifikasi yang fish_user_pathsbukan global PATH. Untuk menghindari keharusan menggunakan Google ini lagi ...

  1. Buat beberapa fungsi yang hanya memodifikasifish_user_paths
  2. Jadikan kedua fungsi autoloading

Untuk menambah jalur pengguna:

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

Untuk menghapus jalur pengguna jika ada (sebagian kredit untuk ini ):

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

Dan tentu saja, untuk menjadikannya autoloading :

funcsave addpaths; funcsave removepath

Contoh penggunaan:

> 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
clozach
sumber
Catatan: Saya baru saja menemukan bahwa pendekatan ini tidak akan menghapus jalur yang ditambahkan melalui beberapa mekanisme lain; Beberapa pembersihan file dot mungkin dilakukan jika Anda menemukan jalur yang kembali setiap kali Anda membuka sesi terminal baru.
clozach
Ini hebat, baru saja ditambahkan ke lokal saya!
Elijah Lynn
3

Ini harus menghapus jalur 6 melalui jalur terakhir:

set -e PATH[6..-1]

Bendera -e dihapus. Lihat help set.

alxrsngrtn
sumber
ini hanya akan bekerja untuk sesi saat ini
Daniel