tmux“ เรียงลำดับ” ตัวแปร PATH หรือไม่?


11

ฉันมีปัญหาที่ทำซ้ำได้:

  1. ตั้งค่าเส้นทางของฉันใน Bash. profile
  2. เริ่มต้นโดย tmux tmux, tmux attachหรือตัวแปรใด ๆ
  3. echo $ PATH และดูด้วยส่วนประกอบเดียวกัน แต่เรียงตามลำดับที่แตกต่างกัน

จะหยุดสิ่งนี้ได้อย่างไร มันอธิบายอะไร

คำตอบ:


26

หากคุณใช้งานบน Mac และสงสัยว่าทำไมจึงถูกเตรียม/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/binการไว้ใน PATH เมื่อคุณเรียกใช้ tmux นั่นเป็นเพราะยูทิลิตี้ที่ชื่อ path_helper ที่เรียกใช้จาก/etc/profileไฟล์ของคุณ

คุณไม่สามารถชักชวน tmux ได้อย่างง่ายดาย (หรือมากกว่า, ทุบตี) ไม่ใช่แหล่งที่มา/etc/profile(ด้วยเหตุผลบางอย่าง tmux จะทำงานเป็นล็อกอินเชลล์เสมอ, ซึ่งหมายถึง / etc / โปรไฟล์จะถูกอ่าน) แต่คุณสามารถมั่นใจได้ว่าผลกระทบของ path_helper don ขันกับเส้นทางของคุณ

เคล็ดลับคือการทำให้แน่ใจว่า PATH นั้นว่างเปล่าก่อนที่ path_helper จะทำงาน ใน~/.bash_profileไฟล์ของฉันฉันมีสิ่งนี้:

if [ -f /etc/profile ]; then
    PATH=""
    source /etc/profile
fi

ล้างเส้นทางก่อนที่จะรัน path_helper จะป้องกันไม่ให้มันจาก prepending เส้นทางเริ่มต้นที่เส้นทางของคุณ (ก่อนหน้านี้) เลือกและจะช่วยให้ส่วนที่เหลือของการติดตั้งสคริปต์ทุบตีส่วนบุคคลของคุณ (คำสั่งต่อไปลง.bash_profileหรือใน.bashrcกรณีที่คุณได้มาจาก.bash_profile) เพื่อตั้งค่าของคุณ เส้นทางตาม

หวังว่าจะทำให้รู้สึก ...


1
ทั้งหมดนี้ทำเพื่อฉัน! ฉันซ่อนมันไว้ข้างหลังif [ -n "$TMUX" ]ประโยคด้วยตัวเอง แต่ฉันสงสัยว่ามันสำคัญ[ -f /etc/profile ]แค่ไหน? การถือว่า/etc/profileเป็นไฟล์ปกติหรือไม่ปลอดภัยหรือไม่
Ryan Lue

1
@RyanLue คุณสามารถแทนที่-fด้วยความสะดวกสบาย-eแต่ฉันจะไม่ลองและแหล่งที่มาของไฟล์จากสคริปต์ที่ได้รับการทำงานเมื่อฉันเข้าสู่ระบบเว้นแต่ฉันจะตรวจสอบว่ามันอยู่ที่นั่น ฉันมักจะใช้สคริปต์ทุบตีของฉันอีกครั้งในเครื่องต่าง ๆ (และระบบปฏิบัติการ) จำนวนมากดังนั้นฉันจึงต้องการตรวจสอบให้แน่ใจว่าพวกเขากำลังกันกระสุน ฉันนึกภาพออกมาว่ายูนิกซ์บางตัวอาจเรียกมันว่าอย่างอื่น
เกรแฮมแอชตัน

5

ไม่มี การเรียงลำดับ$PATHจะเป็นสิ่งที่บ้าเกินกว่าที่จะทำเนื่องจากหลาย ๆ ระบบขึ้นอยู่กับคำสั่งของผู้ใช้

อย่างไรก็ตาม tmux ไม่เริ่มต้นเปลือกของคุณในโหมด "เข้าสู่ระบบ" ที่ก่อให้เกิด~/.profileที่จะมาอีกครั้ง ซึ่งหมายความว่าหากคุณมีสิ่งที่ต้องการPATH=/my/dir:/another/dir:$PATHในแฟ้มที่จะทำอีกครั้งส่งผลให้ใน $ PATH /my/dir:/another/dir:/my/dir:/another/dir:(etc.)มี เพื่อหลีกเลี่ยงปัญหานี้คุณสามารถใช้ตัวแปรอื่นเพื่อตรวจสอบ:

if [ "$_SKIP_PROFILE" ]; then
    return 0
else
    export _SKIP_PROFILE=y
fi

export PATH="/my/dir:/another/dir:$PATH"

0

@ Graham Ashton ขอบคุณสำหรับความคิดของคุณ

ข้อเสนอแนะของฉันจะเป็นที่คุณใส่

if [ -f /etc/profile ]; then
    PATH=""
    source /etc/profile
fi

ที่ไฟล์. zshrc ของคุณที่ด้านบนสุด

ทำให้แน่ใจว่าของคุณ

export NVM_DIR="$HOME/.nvm"
. "/usr/local/opt/nvm/nvm.sh"

อยู่ด้านล่าง

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