วิธีลบเส้นทางจากตัวแปร $ PATH ในปลา?


20

ฉันใช้ปลาเป็นเปลือกหอยของฉันใน Debian และเมื่อเร็ว ๆ นี้ (หลังจากอัปเกรดบางครั้ง) เมื่อใดก็ตามที่ฉันพยายามใช้คำสั่งให้สมบูรณ์ที่ฉันมี:

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

ใช้สิ่งนี้:

echo $PATH 

ให้สิ่งนี้กับฉัน:

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

ในระบบของฉันไม่มี/usr/lib/x86_64-linux-gnu/libfmดังนั้นฉันเข้าใจว่าทำไมปลาถึงบ่น แต่ฉันไม่สามารถหาวิธีลบเส้นทางนี้จาก$PATHตัวแปรของฉัน

ไม่มีใครรู้ว่าฉันจะทำสิ่งนี้ได้อย่างไร


grep -R /usr/lib/x86_64-linux-gnu/libfm ~/.config/fish /usr/share/fish??
เกล็นแจ็คแมน

$ 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

คำตอบ:


33

ว่า 'ปลา' วิธีการตั้งค่าตัวแปร $ PATH set --universal fish_user_paths $fish_user_paths /new/path/hereคือการใช้จริง จากนั้น $ fish_user_paths จะถูกผนวกเข้ากับตัวแปร $ PATH เมื่อเริ่มเซสชันใหม่ เอกสาร $ PATH ไม่ได้บอกวิธีลบในขณะนี้

ในปลาทุกตัวแปรเป็นรายการ (อาร์เรย์) และคุณสามารถเข้าถึงแต่ละรายการได้โดยตรงโดยใช้ดัชนี / ดัชนี echo $fish_user_pathsจะพิมพ์ออกมาเป็นพื้นที่ที่คั่นรุ่นของทุกรายการในรายการให้ช่องว่างขึ้นบรรทัดใหม่ที่มีฟังก์ชั่นแปลและใส่หมายเลขบรรทัดที่มันมีจำนวนสายการทำงานแล้วecho $fish_user_paths | tr " " "\n" แล้วลบมันด้วยecho $fish_user_paths | tr " " "\n" | nl set --erase --universal fish_user_paths[5]คุณต้องใช้มิ--universalฉะนั้นจะไม่สามารถใช้งานได้ในเซสชันใหม่ใด ๆ

หากใครบางคนมีเวลาโปรดส่ง PR ไปยังrepoด้วยตัวอย่างนี้ ผมเปิดปัญหาที่นี่

TLDR;

  1. echo $fish_user_paths | tr " " "\n" | nl // รับจำนวนที่คุณต้องการลบเช่นอันที่ห้า
  2. set --erase --universal fish_user_paths[5] // ลบพา ธ ที่ 5 ในวงกว้างดังนั้นจึงยังคงอยู่ในเซสชันใหม่

ทำไมสิ่งนี้ถึงเป็นความลับ? นี่ไม่ควรเป็นคุณสมบัติในการสร้างและเพิ่มลงในเอกสารประกอบเพื่อให้ผู้คนไม่ต้องไปที่ Google และจบลงที่นี่ใช่ไหม โอ้ดี ..
Pär Nils Amsen

ฉันคิดว่าถ้าเราใช้คำตอบของ @ clozach ที่นี่superuser.com/a/1212305/30982ซึ่งเป็นฟังก์ชั่น addpaths () และ removepath () และเปิด PR จากนั้นจะเป็นขั้นตอนแรกในการเพิ่มเข้ามา ผู้ดูแลส่วนใหญ่ค่อนข้างดีที่จะทำงานด้วยคนหนึ่งดูเหมือนจะไม่พอใจกับฉัน แต่โดยรวมแล้วฉันคิดว่าเราน่าจะมีโอกาสที่ดี นั่นคือขั้นตอนต่อไปของเรา
Elijah Lynn

9

ในฐานะที่เป็นเอลียาห์กล่าวว่าวิธีที่ดีที่สุดคือการปรับเปลี่ยนมากกว่าโลกfish_user_paths PATHหากต้องการหลีกเลี่ยงการใช้ Google อีกครั้ง ...

  1. สร้างฟังก์ชั่นสองอย่างที่แก้ไขเท่านั้นfish_user_paths
  2. ทำให้ทั้งสองฟังก์ชั่นอัตโนมัติ

วิธีเพิ่มไปยังเส้นทางของผู้ใช้:

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

หากต้องการลบเส้นทางผู้ใช้ หากมีอยู่ (ให้เครดิตบางส่วนกับสิ่งนี้ ):

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

และแน่นอนเพื่อให้พวกเขามีการโหลดอัตโนมัติ :

funcsave addpaths; funcsave removepath

ตัวอย่างการใช้งาน:

> 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

นี่เยี่ยมมากเพิ่งเพิ่มไปยังท้องที่ของฉัน!
Elijah Lynn

3

สิ่งนี้ควรลบเส้นทาง 6 ผ่านเส้นทางสุดท้าย:

set -e PATH[6..-1]

แฟล็ก -e ถูกลบ help setดู


สิ่งนี้จะใช้ได้กับเซสชันปัจจุบันเท่านั้น
Daniel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.