cd 后 umask 更改为 0002

cd 后 umask 更改为 0002

我注意到我的 Ubuntu 12.04 LTS 系统上有一个奇怪的行为。这是我第一次使用 Ubuntu;之前我用的是Fedora,从来没有遇到过这个问题。

我已将 .bashrc 中的 umask 设置为 0027。但每次我 cd 到另一个目录时,它都会自动更改为 0002。我进入哪个目录并不重要;每次目录更改都会导致 umask 更改。

bbrown@cs:~$ umask
0027
bbrown@cs:~$ cd /
bbrown@cs:/$ umask
0002
bbrown@cs:/$ umask 027
bbrown@cs:/$ cd /var/log
bbrown@cs:/var/log$ umask
0002

如果我只是在cd没有目录的情况下使用,甚至会发生这种情况:

bbrown@cs:/var/log$ cd
bbrown@cs:~$ umask 027
bbrown@cs:~$ umask
0027
bbrown@cs:~$ cd
bbrown@cs:~$ umask
0002

我搜索过其他一些讨论板。类似的问题是在 Stack Overflow 上询问没有解决方案。

我对这些目录都没有特殊的 ACL。

bbrown@cs:/var/log$ getfacl /
getfacl: Removing leading '/' from absolute path names
# file: .
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

bbrown@cs:/var/log$ getfacl /var/log
getfacl: Removing leading '/' from absolute path names
# file: usr/bin
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

文件系统是 ext4,没有 ACL 安装选项:

bbrown@cs:/var/log$ more /etc/fstab
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    nodev,noexec,nosuid 0       0
/dev/mapper/vg0-root /               ext4    errors=remount-ro 0       1
# /boot was on /dev/vda1 during installation
UUID=0da490ac-183d-45cd-a490-5d7ac3663337 /boot           ext2    defaults        0       2
/dev/mapper/vg0-export /export         ext4    defaults        0       2
/dev/mapper/vg0-home /home           ext4    defaults        0       2
/dev/mapper/vg0-var /var            ext4    defaults        0       2
/dev/mapper/vg0-mysql /var/lib/mysql  ext4    defaults        0       2
/dev/mapper/vg0-pgsql /var/lib/postgresql ext4    defaults        0       2
/dev/mapper/vg0-swap none            swap    sw              0       0

csh 不会表现出这种行为;据我所知,这只是 bash。

发生了什么事以及如何禁用它?

更新

我从 Fedora 13 系统复制了 bash 并将其放在我的主目录中。该版本没有出现该问题。

bbrown@cs:~$ /bin/bash --version
GNU bash, version 4.2.24(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
bbrown@cs:~$ ls -l /bin/bash
-rwxr-xr-x 1 root root 955024 Apr  3 08:58 /bin/bash
bbrown@cs:~$ ls -l ./bash
-rwxr-xr-x 1 bbrown bbrown 904664 Sep 11 13:02 ./bash
bbrown@cs:~$ ./bash --version
GNU bash, version 4.1.7(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
bbrown@cs:~$ exec ./bash
bbrown@cs:~$ umask
0027
bbrown@cs:~$ cd /
bbrown@cs:/$ umask
0027

根据要求,以下是输出type cd

bbrown@cs:~$ type cd
cd is a function
cd () 
{ 
    if builtin cd "$@"; then
        [[ -n "${rvm_current_rvmrc:-}" && "$*" == "." ]] && rvm_current_rvmrc="" || true;
        __rvm_do_with_env_before;
        __rvm_project_rvmrc;
        __rvm_after_cd;
        __rvm_do_with_env_after;
        return 0;
    else
        return $?;
    fi
}

这很能说明问题。 RVM 已控制该cd命令。这很烦人,但它确实解释了正在发生的事情。

答案1

cd不改变 umask。要么你已经重载了cd,要么你有一个命令前或命令后的钩子。

通过运行检查是否cd已超载type cd。这将向您显示它是“shell 内置函数”(好)还是别名或函数(可疑)。

运行echo "$PROMPT_COMMAND"以查看是否有命令后挂钩(bash 在显示每个提示之前评估此变量的值)。还要检查在每个命令之前执行的调试陷阱trap -p DEBUG

相关内容