我注意到我的 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
。