zsh: ตั้งค่าตัวแปรสภาพแวดล้อมโดยอัตโนมัติสำหรับไดเรกทอรี


5

สมมติว่าฉันมีโครงการใน:

~/working_dir

เมื่อใดก็ตามที่ฉันเรียกใช้คำสั่งจากไดเรกทอรีนี้ฉันต้องมีการตั้งค่าตัวแปรสภาพแวดล้อมบางอย่าง ดังนั้นฉันสามารถส่งออกได้เช่น:

export VAR=value

อย่างไรก็ตามมีจำนวนมากและน่าเบื่ออีกทั้งฉันลืมบางครั้งและเรียกใช้คำสั่งเพื่อให้มันล้มเหลวเนื่องจากไม่มีตัวแปรสภาพแวดล้อมที่ให้รหัส API หรือบางอย่าง

มีวิธีที่ฉันสามารถให้ zsh จดจำตัวแปรสภาพแวดล้อมเหล่านี้สำหรับไดเรกทอรีนี้หรือไม่ดังนั้นเมื่อใดก็ตามที่ฉันเรียกใช้คำสั่งใด ๆ จากไดเรกทอรีนั้นจะทำงานด้วยชุดตัวแปรสภาพแวดล้อมเหล่านั้นหรือไม่

คำตอบ:


7

มันเป็นไปได้ที่จะทำเช่นนี้ - นี่เป็นscreencastใช้grml ZSH การกำหนดค่า

ข้อมูลเพิ่มเติม:

แก้ไข: นี่เป็นเรื่องง่ายที่จะทำ นี่คือส่วนที่เกี่ยวข้องของคุณ~/.zshrc:

function chpwd_profiles() {
    local profile context
    local -i reexecute

    context=":chpwd:profiles:$PWD"
    zstyle -s "$context" profile profile || profile='default'
    zstyle -T "$context" re-execute && reexecute=1 || reexecute=0

    if (( ${+parameters[CHPWD_PROFILE]} == 0 )); then
        typeset -g CHPWD_PROFILE
        local CHPWD_PROFILES_INIT=1
        (( ${+functions[chpwd_profiles_init]} )) && chpwd_profiles_init
    elif [[ $profile != $CHPWD_PROFILE ]]; then
        (( ${+functions[chpwd_leave_profile_$CHPWD_PROFILE]} )) \
            && chpwd_leave_profile_${CHPWD_PROFILE}
    fi  
    if (( reexecute )) || [[ $profile != $CHPWD_PROFILE ]]; then
        (( ${+functions[chpwd_profile_$profile]} )) && chpwd_profile_${profile}
    fi  

    CHPWD_PROFILE="${profile}"
    return 0
}
# Add the chpwd_profiles() function to the list called by chpwd()!
chpwd_functions=( ${chpwd_functions} chpwd_profiles )

เปิดใช้งานโปรไฟล์สำหรับแต่ละไดเรกทอรีที่คุณต้องการ:

zstyle ':chpwd:profiles:/path/to/directory(|/|/*)' profile NAME

และอย่าลืมสร้างโปรไฟล์จริงๆ:

chpwd_profile_NAME() {
    [[ ${profile} == ${CHPWD_PROFILE} ]] && return 1
    print "chpwd(): Switching to profile: $profile"

    export VAR=value
}

แก้ไข # 2: จริง ๆ แล้วจะค่อนข้างเรียบร้อยคู่กับไดเรกทอรีชื่อ [Stackoverflow.net]


3
ไม่มีอะไรที่ "ง่าย" เกี่ยวกับโซลูชันนี้
ฝน

@rane เห็นด้วย! ดูซับซ้อนสำหรับฉัน
Bklyn

ฉันไม่ใช่ผู้เชี่ยวชาญที่นี่ แต่ที่ด้านล่างของ. zshrc ฉันเพิ่มchpwd_profilesดังนั้นหากฉันเปิดแท็บเทอร์มินัลใหม่มันจะทำการตรวจสอบ chpwd
โคลิน

2

คุณสามารถใช้https://github.com/horosgrisa/autoenvเพื่อบรรลุเป้าหมายนั้นได้ ฉันใช้แอนติเจนเพื่อใช้งานแบบนี้:

antigen bundle horosgrisa/autoenv

จากนั้นเมื่อคุณเข้าไปในไดเรกทอรีที่มี.envไฟล์อยู่ในนั้นมันจะเป็นแหล่งที่มาและคุณสามารถ ser ตัวแปรที่นั่น


2

แม้ว่านี่จะเป็นคำถามเก่า แต่ฉันต้องการเพิ่มโซลูชันที่ง่ายนี้จากhttps://coderwall.com/p/a3xreg/per-directory-zsh-config

// Add this to your ~/.zshrc
function chpwd() {
  if [ -r $PWD/.zsh_config ]; then
    source $PWD/.zsh_config
  else
    source $HOME/.zshrc
  fi
}

วิธีนี้ใช้งานได้ดี แต่คุณสามารถข้ามบรรทัดที่ 5-6 ได้ถ้าคุณโหลดอยู่แล้ว.zshrcเมื่อ zsh ถูกเตรียมใช้งาน
jstr

@jstr มันคือการรีเซ็ตสิ่งที่$PWD/.zsh_configทำ
aars

0

ไม่ใช่สำหรับแต่ละไดเรกทอรีไม่ใช่ แต่ถ้าเหมือนกันคุณสามารถใส่ไว้ในไฟล์เริ่มต้น (.bash_profile สำหรับ bash ไม่แน่ใจว่าเป็น zsh) มิฉะนั้นฉันขอแนะนำเพียงแค่วางการตั้งค่าทั้งหมดในไฟล์ในไดเรกทอรีนั้นและหามันก่อนเรียกใช้คำสั่ง ไม่ใช่วิธีแก้ปัญหาในอุดมคติ แต่ฉันคิดว่ามันใกล้เคียงกับสิ่งที่ดีที่สุดที่คุณจะหาได้


0

คุณสามารถสร้างสคริปต์ที่ตั้งค่า env และเปลี่ยนคุณเป็นไดเรกทอรีนั้น .. จากนั้นใช้มันแทน cd working_dir


0

เมื่อเทียบกับเครื่องมืออื่น ๆ ที่ออกแบบมาสำหรับสิ่งนี้direnvถือว่าเป็นสิ่งที่ดีที่สุด

direnvเป็นตัวสลับสภาพแวดล้อมสำหรับเชลล์ มันรู้วิธีการเกี่ยวกับ bash, zsh, tcsh, fish shell และ elvish ในการโหลดหรือยกเลิกการโหลดตัวแปรสภาพแวดล้อมขึ้นอยู่กับไดเรกทอรีปัจจุบัน สิ่งนี้อนุญาตให้ตัวแปรสภาพแวดล้อมเฉพาะโครงการโดยไม่ทำให้รก~/.profileไฟล์

สิ่งที่ทำให้direnvแตกต่างระหว่างเครื่องมือที่คล้ายกันอื่น ๆ :

  • direnvเขียนใน Go เร็วกว่าเมื่อเปรียบเทียบกับ Python
  • direnvรองรับการยกเลิกการโหลดตัวแปรสภาพแวดล้อมเมื่อคุณออกจาก dir ที่เฉพาะเจาะจง
  • direnv ครอบคลุมเปลือกหอยจำนวนมาก

โครงการที่คล้ายกัน

  • โมดูลสภาพแวดล้อม - หนึ่งในระบบโหลดสภาพแวดล้อมที่เก่าแก่ที่สุด (ในทางที่ดี)
  • autoenv - น้ำหนักเบา; ไม่รองรับการยกเลิกการโหลด เขียนช้าใน Python
  • zsh-autoenv - ส่วนผสมที่มีคุณสมบัติหลากหลายของ autoenv และsmartcd : เข้า / ออกเหตุการณ์, ซ้อน, stashing (เฉพาะ Zsh)
  • asdf - โซลูชั่นทุบตีบริสุทธิ์ที่มีระบบปลั๊กอิน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.