Сценарии в /etc/profile.d Игнорируется?

50

Я новичок в Ubuntu. Я запускаю рабочий стол 13.10.

Я хотел установить некоторые системные псевдонимы и пользовательское приглашение для bash. Я нашел эту статью:

Ссылка

Следуя советам в этой статье, я создал /etc/profiles.d/profile_local.sh. Он принадлежит root и имеет разрешения 644, как и другие скрипты:

[email protected]:/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

Я также подтвердил, что / etc / profile вызывает /etc/profile.d. Он содержит этот блок кода:

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

При входе в систему, похоже, не создается собственный скрипт, профиль_local.sh, который я создал. Однако, если после входа в систему I 'source /etc.profile.d/profile_local.sh', я получаю ожидаемое поведение, мои пользовательские псевдонимы и пользовательское приглашение.

Что я делаю неправильно?

Содержание скрипта '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/~}%pr_e%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\]\[email protected]\h\[3[01;34m\] \w \$\[3[00m\] '
        fi

        alias ls='ls --color=auto'
        alias grep='grep --colour=auto'
else
        if [[ ${EUID} == 0 ]] ; then
                # show [email protected] when we don't have colors
                PS1='\[email protected]\h \W \$ '
        else
                PS1='\[email protected]\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
    
задан Drew 23.03.2014 в 17:55
источник

3 ответа

90

Чтобы понять, что здесь происходит, вам нужно понять небольшую справочную информацию о том, как запускаются оболочки (bash в этом случае).

  • Когда вы открываете эмулятор терминала (например, gnome-terminal ), вы выполняете так называемую оболочку interactive, non-login .

  • Когда вы входите в свой компьютер из командной строки, используя ssh или выполняете команду, например su - username , вы запускаете оболочку интерактивного входа .

  • Когда вы входите в систему графически, вы запускаете что-то совершенно другое, детали будут зависеть от вашей системы и графической среды, но в общем случае это графическая оболочка , которая касается вашего логина. Хотя многие графические оболочки (включая Ubuntu по умолчанию) будут читать /etc/profile , не все из них делают.

  • Наконец, когда вы запускаете сценарий оболочки, он запускается в неинтерактивной оболочке без входа .

Теперь файлы, которые bash будут читать при запуске, будут зависеть от типа оболочки, в которой она запущена. Ниже приведен фрагмент раздела INVOCATION man bash (основное внимание):

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.

Все это означает, что вы редактируете неправильный файл. Вы можете проверить это, нажав на виртуальную консоль, используя Ctrl + Alt + F2 (вернитесь в графический интерфейс с Alt + F7 или F8 в зависимости от вашей установки) и войдите в систему. Вы увидите, что доступны ваши подсказки и псевдонимы.

Итак, для того, чтобы параметр, который вы хотите применить к оболочкам без входа, тип, который вы получаете каждый раз при открытии терминала, вместо этого вы должны внести свои изменения в ~/.bashrc . В качестве альтернативы вы также можете разместить свои псевдонимы в файле ~/.bash_aliases (однако обратите внимание, что это функция Ubuntu, и вы не должны ожидать, что она будет работать с другими дистрибутивами).

Подробнее о том, какой файл следует использовать для чего, см. здесь .

ПРИМЕЧАНИЯ:

  • Debian (и по расширению Ubuntu) также имеет значение по умолчанию ~/.profile source ~/.bashrc . Это означает, что любые изменения, внесенные вами в ~/.bashrc , также будут наследоваться с помощью систем входа, но i) это не так на всех машинах Linux / Unix, и ii) обратное неверно, поэтому вы должны всегда работать с ~/.bashrc & amp; co, а не ~/.profile или /etc/profile .

  • Кроме того, общее примечание об использовании, изменения, внесенные в файлы конфигурации в /etc , будут влиять на пользователей all . Обычно это не то, что вы хотите сделать, и его следует избегать. Вы всегда должны использовать эквивалентные файлы в своем домашнем каталоге ( ~/ ).

  • Различные файлы конфигурации читаются последовательно. В частности, для систем входа в систему порядок:

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

    Это означает, что любая настройка в ~/.profile перезапишет все, что установлено в предыдущих файлах.

ответ дан terdon 23.03.2014 в 18:39
источник
0

Другая возможность, особенно для настроек, таких как настройки истории HISTSIZE , HISTFILESIZE , HISTCONTROL и PS1 , заключается в том, что файлы загружаются, но параметры перезаписываются в другом файле, который является источником позже, с наиболее вероятным виновником является ~/.bashrc . (У меня есть набор настроек по умолчанию для наших серверов, например приглашение, красное для root, чтобы предупреждать пользователя и большие истории с отметками времени)

По умолчанию Ubuntu .bashrc из /etc/skel устанавливает несколько параметров, которые могли бы иметь смысл установить где-то там, где он не будет переопределять настройки, установленные владельцем системы из /etc/profile.d (Like /etc/bash.bashrc ) (если пользователь редактирует их .bashrc , это нормально, чтобы перезаписать настройки, файлы по умолчанию системы более раздражают)

    
ответ дан Gert van den Berg 10.04.2018 в 10:02
-2

ВЕРСИЯ="16.04.3 LTS (Xenial Xerus)"

Хорошо, поэтому каждый предположил, что человек здесь не хочет /etc/profile.d/somefile.sh для всех пользователей, но в моем случае это именно то, что я хотел.

На самом деле, как это получается с Ubuntu, если вы используете это, и хотите, чтобы он вступил в силу в вашей графической оболочке, все, что вам нужно сделать, это установить файл, а затем выйти и снова войти. Все ваши консоли или все, что вы запускаете, будь то тип xterm или тип консоли (или отбрасывание в оболочку), теперь будет иметь этот файл.

Не нужно использовать .bashrc и т. д. для всех пользователей. Извините, это было неясно в ответе выше. Все, что они сказали, правда, но на самом деле его в основном не так, как все, что запускает менеджер окон, наследует эти настройки, поэтому просто заново зарегистрируйтесь и решите свою проблему, и не беспокойтесь о .bashrc и т. Д., Если вы намерены применить его ко всем пользователям .

    
ответ дан Isaac Kane Egglestone 23.01.2018 в 23:21