我可以在特定目录上设置 umask 吗?

我可以在特定目录上设置 umask 吗?

我的 umask 设置相当严格 (0077)。这没问题,但我有一个目录,我想对该目录下创建的所有文件使用更宽松的设置 (0002)。有没有办法在特定目录上设置 umask,以便在该目录下创建的所有文件都继承相同的权限?

答案1

使用 ACL:

正常情况下,该命令可以起作用:

setfacl -d -m mask:002 /your/dir/here/

对于 MacOS,您必须使用chmod
请参阅:手册页
看:这个答案

如果想要为登录设置不同的 umask,通常只需将 添加umask 002到 shell .profile 或 shell 启动文件中。如果在该配置文件/环境下登录,所有新目录都将使用此 umask。但是,请阅读有关 Mac umask 的信息,因为这似乎是让它工作的方式登录时取决于您的操作系统版本和使用 Mac launchctl

看: https://stackoverflow.com/q/27888296/503621
看: https://support.apple.com/en-us/HT201684

答案2

提供另一种解决方案外壳钩子direnv。如果setfacl您的系统不支持,以下解决方案可能更兼容。(例如 macOS)

direnv是 shell 的环境切换器。它知道如何挂载 bash、zsh、tcsh、fish shell 和 elvish 来加载或卸下环境变量取决于当前目录

.envrc对特定目录使用export自定义umask值,export当您离开该目录时,ed 环境变量将被卸载。

# example .envrc file
export UMASK=0022

定义一个钩子,umask一旦工作目录改变,就改变其值。

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。如果 pull requestGH-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

来源:基于 cwd 的动态 umask.md

相关内容