umask muda para 0002 depois do cd

4

Eu notei um comportamento estranho no meu sistema Ubuntu 12.04 LTS. Esta é minha primeira experiência com o Ubuntu; anteriormente eu usei o Fedora e nunca tive esse problema.

Eu configurei minha umask em .bashrc para 0027. Mas ela muda automaticamente para 0002 toda vez que eu clico em outro diretório. Não importa em qual diretório eu vá; cada mudança de diretório resulta na troca de 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

Isso acontece mesmo se eu usar apenas cd sem um diretório:

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

Eu pesquisei em alguns outros fóruns de discussão. Uma pergunta semelhante foi solicitada no Stack Overflow sem resolução.

Não tenho ACLs especiais em nenhum desses diretórios.

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

Sistemas de arquivos são ext4 sem opções de montagem do 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

O csh não exibe esse comportamento; é bash apenas até onde eu sei.

O que está acontecendo e como desabilito isso?

Atualizar

Eu copiei bash do meu sistema Fedora 13 e coloquei no meu diretório home. Essa versão não exibe o problema.

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

Conforme solicitado, aqui está a saída de 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
}

Isso é revelador. O RVM assumiu o controle do comando cd . Isso é chato, mas certamente explica o que está acontecendo.

    
por Barry Brown 11.09.2012 / 21:58

1 resposta

4

cd não altera a umask. Você sobrecarregou cd ou tem um gancho de pré ou pós-comando.

Verifique se cd não foi sobrecarregado executando type cd . Isto irá mostrar se é um “shell builtin” (bom) ou um alias ou função (suspeito).

Execute echo "$PROMPT_COMMAND" para ver se você tem um gancho de pós-comando (o bash avalia o valor dessa variável antes de exibir cada prompt). Verifique também se há uma armadilha de depuração que é executada antes de cada comando com trap -p DEBUG .

    
por 12.09.2012 / 03:47

Tags