ให้แก้ปัญหาอับละอองเกสรดำเนินการกับตะขอเปลือกdirenvและ วิธีแก้ไขปัญหาต่อไปนี้อาจเข้ากันได้มากกว่าในกรณีsetfaclที่ระบบของคุณไม่สามารถใช้งานได้ (เช่น macOS)
  direnvเป็นตัวสลับสภาพแวดล้อมสำหรับเชลล์ มันรู้วิธีที่จะขอเข้าสู่ทุบตี zsh, tcsh, หอยปลาและภูติโหลดหรือขนตัวแปรสภาพแวดล้อมทั้งนี้ขึ้นอยู่กับไดเรกทอรีปัจจุบัน
ใช้.envrcในการexportกำหนดเองumaskค่าสำหรับ dir ที่เฉพาะเจาะจงและexportvar เอ็ด env จะถูกยกเลิกการโหลดเมื่อคุณออกจากผบว่า
# example .envrc file
export UMASK=0022
กำหนด hook เพื่อเปลี่ยนumaskค่าเมื่อเปลี่ยน dir ที่ทำงาน
function _umask_hook {
  if [[ -n $UMASK ]]; then
    umask "$UMASK"
  elif [[ $OSTYPE == darwin* ]]; then
    umask 0077
  else
    umask 0022
  fi
}
# To make the code more reliable on detecting the default umask
function _umask_hook {
  # Record the default umask value on the 1st run
  [[ -z $DEFAULT_UMASK ]] && export DEFAULT_UMASK="$(builtin umask)"
  if [[ -n $UMASK ]]; then
    umask "$UMASK"
  else
    umask "$DEFAULT_UMASK"
  fi
}
# zsh hooks
# trigger _umask_hook once working dir is changed
add-zsh-hook chpwd _umask_hook
# bash
# Append `;` if PROMPT_COMMAND is not empty
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND;}_umask_hook"
ในตอนนี้การเริ่มต้น direnv hook สำหรับ zsh ไม่รองรับchpwdhook หากคำขอเกี่ยวกับการดึงGH-514ยังไม่ถูกรวมเข้าด้วยกันเมื่อคุณเห็นหน้านี้ โปรดแสดงความคิดเห็นeval "$(direnv hook zsh)"และขอdirenvเกี่ยวchpwdด้วยตนเองด้วยรหัสต่อไปนี้
if (( $+commands[direnv] )) && ! (( $+functions[_direnv_hook] )); then
  _direnv_hook() {
    eval "$(command "direnv" export zsh)";
  }
  typeset -agU precmd_functions;
  if [[ -z ${precmd_functions[(r)_direnv_hook]} ]]; then
    precmd_functions=( _direnv_hook ${precmd_functions[@]} )
  fi
  typeset -agU chpwd_functions;
  if [[ -z ${chpwd_functions[(r)_direnv_hook]} ]]; then
    chpwd_functions=( _direnv_hook ${chpwd_functions[@]} )
  fi
fi
ที่มา: dynamic-umask-based-on-cwd.md