Scripts em /etc/profile.d Ser ignorado?

50

Eu sou novo no Ubuntu. Estou executando 13.10 Desktop.

Eu queria definir alguns aliases de todo o sistema e um prompt personalizado para o bash. Eu encontrei este artigo:

link

Seguindo o conselho deste artigo, criei /etc/profiles.d/profile_local.sh. É de propriedade do root e tem permissões de 644 exatamente como os outros scripts lá:

root@ubuntu:/etc/profile.d# ll
total 28
drwxr-xr-x   2 root root  4096 Mar 23 08:56 .
drwxr-xr-x 135 root root 12288 Mar 23 09:15 ..
-rw-r--r--   1 root root   660 Oct 23  2012 bash_completion.sh
-rw-r--r--   1 root root  3317 Mar 23 07:36 profile_local.sh
-rw-r--r--   1 root root  1947 Nov 23 00:57 vte.sh

Confirmei ainda que o / etc / profile chama o /etc/profile.d. Ele contém esse bloco de código:

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

Após o login, não parece que o script personalizado, profile_local.sh que eu criei, seja originado. No entanto, se após o login eu 'source /etc.profile.d/profile_local.sh', eu obtiver o comportamento esperado, meus aliases personalizados e o prompt personalizado.

O que estou fazendo de errado?

Conteúdo do script 'profile_local.sh':

# 3/23/14 - Copied from Gentoo /etc/bash/bashrc
# Placed in /etc/profile.d as described at:
# https://help.ubuntu.com/community/EnvironmentVariables

# This file is sourced by all *interactive* bash shells on startup,
# including some apparently interactive shells such as scp and rcp
# that can't tolerate any output.  So make sure this doesn't display
# anything or bad things will happen !


# Test for an interactive shell.  There is no need to set anything
# past this point for scp and rcp, and it's important to refrain from
# outputting anything in those cases.
if [[ $- != *i* ]] ; then
        # Shell is non-interactive.  Be done now!
        return
fi

# Bash won't get SIGWINCH if another process is in the foreground.
# Enable checkwinsize so that bash will check the terminal size when
# it regains control.  #65623
# http://cnswww.cns.cwru.edu/~chet/bash/FAQ (E11)
shopt -s checkwinsize

# Enable history appending instead of overwriting.  #139609
shopt -s histappend

# Change the window title of X terminals 
case ${TERM} in
        xterm*|rxvt*|Eterm|aterm|kterm|gnome*|interix)
                PROMPT_COMMAND='echo -ne "3]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}
root@ubuntu:/etc/profile.d# ll
total 28
drwxr-xr-x   2 root root  4096 Mar 23 08:56 .
drwxr-xr-x 135 root root 12288 Mar 23 09:15 ..
-rw-r--r--   1 root root   660 Oct 23  2012 bash_completion.sh
-rw-r--r--   1 root root  3317 Mar 23 07:36 profile_local.sh
-rw-r--r--   1 root root  1947 Nov 23 00:57 vte.sh
7"' ;; screen) PROMPT_COMMAND='echo -ne "3_${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}3\"' ;; esac use_color=false # Set colorful PS1 only on colorful terminals. # dircolors --print-database uses its own built-in database # instead of using /etc/DIR_COLORS. Try to use the external file # first to take advantage of user additions. Use internal bash # globbing instead of external grep binary. safe_term=${TERM//[^[:alnum:]]/?} # sanitize TERM match_lhs="" [[ -f ~/.dir_colors ]] && match_lhs="${match_lhs}$(<~/.dir_colors)" [[ -f /etc/DIR_COLORS ]] && match_lhs="${match_lhs}$(</etc/DIR_COLORS)" [[ -z ${match_lhs} ]] \ && type -P dircolors >/dev/null \ && match_lhs=$(dircolors --print-database) [[ $'\n'${match_lhs} == *$'\n'"TERM "${safe_term}* ]] && use_color=true if ${use_color} ; then # Enable colors for ls, etc. Prefer ~/.dir_colors #64489 if type -P dircolors >/dev/null ; then if [[ -f ~/.dir_colors ]] ; then eval $(dircolors -b ~/.dir_colors) elif [[ -f /etc/DIR_COLORS ]] ; then eval $(dircolors -b /etc/DIR_COLORS) fi fi if [[ ${EUID} == 0 ]] ; then PS1='\[3[01;31m\]\h\[3[01;34m\] \W \$\[3[00m\] ' else PS1='\[3[01;32m\]\u@\h\[3[01;34m\] \w \$\[3[00m\] ' fi alias ls='ls --color=auto' alias grep='grep --colour=auto' else if [[ ${EUID} == 0 ]] ; then # show root@ when we don't have colors PS1='\u@\h \W \$ ' else PS1='\u@\h \w \$ ' fi fi # Try to keep environment pollution down, EPA loves us. unset use_color safe_term match_lhs TZ="PST8PDT" alias ll='ls -la' alias dig='dig +search' alias dir='ls -ba' alias edit="ee" alias ss="ps -aux" alias dot='ls .[a-zA-Z0-9_]*' alias news="xterm -g 80x45 -e trn -e -S1 -N &" alias more="less" alias c="clear" alias m="more" alias j="jobs" # common misspellings alias mroe=more alias pdw=pwd
    
por Drew 23.03.2014 / 17:55

3 respostas

91

Para entender o que está acontecendo aqui, você precisa entender um pouco das informações básicas sobre como as shells (bash, neste caso) são executadas.

  • Quando você abre um emulador de terminal ( gnome-terminal , por exemplo), está executando o que é conhecido como um shell interativo, sem login .

  • Quando você faz login na sua máquina a partir da linha de comando, via ssh , ou executa um comando como su - username , você está executando um shell login interativo .

  • Quando você faz login graficamente, você está executando algo completamente diferente, os detalhes dependerão do seu sistema e ambiente gráfico, mas em geral é o shell gráfico que lida com seu login. Enquanto muitos shells gráficos (incluindo o padrão do Ubuntu) vão ler /etc/profile nem todos eles fazem.

  • Finalmente, quando você executa um script de shell, ele é executado em um shell não-interativo, não-login .

Agora, os arquivos que o bash lerá quando lançado dependerão do tipo de shell em que ele está sendo executado. A seguir, um trecho da seção INVOCATION de man bash (ênfase minha):

When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable. The --noprofile option may be used when the shell is started to inhibit this behavior.

When an interactive shell that is not a login shell is started, bash reads and executes commands from /etc/bash.bashrc and ~/.bashrc, if these files exist. This may be inhibited by using the --norc option. The --rcfile file option will force bash to read and execute commands from file instead of /etc/bash.bashrc and ~/.bashrc.

O que tudo isso significa é que você está editando o arquivo errado. Você pode testar isso largando para um console virtual usando Ctrl + Alt + F2 (retorne à GUI com Alt + F7 , ou F8 dependendo da sua configuração) e logando lá. Você verá que seu prompt e aliases estão disponíveis.

Assim, para que a configuração desejada seja aplicada a shells que não são de login, o tipo que você recebe toda vez que abrir um terminal, você deve fazer as alterações em ~/.bashrc . Alternativamente, você também pode colocar seus aliases no arquivo ~/.bash_aliases (no entanto, note que este é um recurso do Ubuntu e você não deve esperar que ele funcione em outras distribuições).

Para mais detalhes sobre qual arquivo deve ser usado para o quê, veja aqui .

NOTAS:

  • O Debian (e por extensão o Ubuntu) também tem o padrão ~/.profile source ~/.bashrc . Isto significa que qualquer mudança que você fizer em ~/.bashrc também será herdada por shells de login, mas i) este não é o caso em todas as máquinas Linux / Unix e ii) o inverso não é verdade, razão pela qual você deve sempre trabalhar com ~/.bashrc & co em vez de ~/.profile ou /etc/profile .

  • Além disso, uma observação geral sobre o uso, as alterações feitas nos arquivos de configuração em /etc afetarão todos usuários. Isso geralmente não é o que você quer fazer e deve ser evitado. Você deve sempre usar os arquivos equivalentes em seu diretório pessoal ( ~/ ).

  • Os vários arquivos de configuração são lidos sequencialmente. Especificamente, para shells de login, a ordem é:

    /etc/profile -> /etc/profile.d/* (in alphabetical order) -> ~/.profile
    

    Isso significa que qualquer configuração em ~/.profile sobrescreverá qualquer coisa definida nos arquivos anteriores.

por terdon 23.03.2014 / 18:39
1

Outra possibilidade, especialmente para configurações como as configurações de histórico HISTSIZE , HISTFILESIZE , HISTCONTROL e PS1 é que os arquivos estão sendo carregados, mas as configurações são sobrescritas em outro arquivo que é a origem mais tarde, com o culpado mais provável é ~/.bashrc . (Eu tenho um conjunto padrão de configurações para nossos servidores, como um prompt que é vermelho para root para avisar o usuário e grandes históricos com timestamps)

O padrão% .bashrc de /etc/skel define várias configurações, o que pode ter feito sentido definir de algum lugar onde não substituiria as configurações definidas pelo proprietário do sistema de /etc/profile.d (Como /etc/bash.bashrc ) (Se usuário edita seu .bashrc , é bom sobrescrever configurações, os arquivos padrão do sistema são mais irritantes)

    
por Gert van den Berg 10.04.2018 / 10:02
-2

VERSION="16.04.3 LTS (Xenial Xerus)"

Ok, todos presumiram que a pessoa aqui não deseja /etc/profile.d/somefile.sh para todos os usuários, mas, no meu caso, é exatamente isso que eu queria.

Então, na verdade, como acontece com o Ubuntu, se você usar isso e quiser que ele tenha efeito no seu shell gráfico, tudo o que você precisa fazer é definir o arquivo e, em seguida, fazer logout e voltar novamente. Todos os seus consoles ou qualquer coisa que você iniciar, seja do tipo xterm ou do tipo console (ou caindo no shell), agora terão esse arquivo.

Não há necessidade de usar .bashrc etc para todos os usuários. Desculpe isso só não ficou claro na resposta acima. Tudo o que eles disseram é verdade, mas na realidade não é verdade como tudo o que o gerenciador de janelas lança herdará essas configurações para que você faça o login novamente e resolva o problema e não se incomode com .bashrc etc se sua intenção é aplicá-lo a todos os usuários .

    
por Isaac Kane Egglestone 23.01.2018 / 23:21

Tags