Scripts em /etc/profile.d Sendo ignorado?

56

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 este 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

5 respostas

102

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, está executando algo completamente diferente, os detalhes dependerão do sistema e do 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 shell script, 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.

Portanto, 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 quaisquer mudanças que você fizer em ~/.bashrc também serão herdadas 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

Siga este caminho:

  • Abra o Editar - > Preferências
  • Na primeira guia "Geral", no rótulo "Comando", ative "Executar comando como shell de login"
por 11.03.2019 / 23:26
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 substituídas 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, que podem ter feito sentido em 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
0

no Debian para a sessão do Terminal Eu resolvi este problema para todos os usuários assim:

adicionado a

sudo nano /etc/bash.bashrc

bloco

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

de

/etc/profile
    
por 29.04.2019 / 13:59
-1

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 em 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 para o 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 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 for aplicá-lo a todos os usuários .

    
por Isaac Kane Egglestone 23.01.2018 / 23:21

Tags