Скрипты в /etc/profile.d игнорируются?
Я новичок в Ubuntu. У меня работает 13.10 Desktop.
Я хотел установить псевдонимы для всей системы и настраиваемое приглашение для bash. Я нашел эту статью:
https://help.ubuntu.com/community/EnvironmentVariables
Следуя советам в этой статье, я создал /etc/profiles.d/profile_local.sh. Он принадлежит пользователю root и имеет разрешения 644, как и другие скрипты:
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
Я также подтвердил, что / 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
При входе в систему не получается, что созданный мной нестандартный скрипт profile_local.sh получен. Однако, если после входа в систему я '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 "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}\007"'
;;
screen)
PROMPT_COMMAND='echo -ne "\033_${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}\033\\"'
;;
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='\[\033[01;31m\]\h\[\033[01;34m\] \W \$\[\033[00m\] '
else
PS1='\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[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
5 ответов
Чтобы понять, что здесь происходит, вам нужно понять небольшую справочную информацию о том, как работают оболочки (в данном случае bash).
При открытии терминала эмулятор (
gnome-terminal
например), вы выполняете так называемую интерактивную оболочку без авторизации.Когда вы входите в свою машину из командной строки, через
ssh
или выполните команду, такую какsu - username
вы используете интерактивную оболочку входа в систему.Когда вы входите в систему графически, вы запускаете что-то совершенно другое, детали будут зависеть от вашей системы и графической среды, но в целом это графическая оболочка, которая обрабатывает ваш логин. В то время как многие графические оболочки (включая Ubuntu по умолчанию) будут читать
/etc/profile
не все из них делают.Наконец, когда вы запускаете сценарий оболочки, он запускается в неинтерактивной оболочке без входа в систему.
Теперь файлы, которые bash будет читать при запуске, зависят от типа оболочки, под которой он работает. Ниже приведен отрывок из раздела ПРИЗНАНИЕ man bash
(выделение мое):
Когда bash вызывается как интерактивная оболочка входа в систему или как неинтерактивная оболочка с параметром --login, она сначала читает и выполняет команды из файла / etc / profile, если этот файл существует. После прочтения этого файла он ищет ~/.bash_profile, ~/.bash_login и ~/.profile в указанном порядке, а также читает и выполняет команды из первой, которая существует и доступна для чтения. Опция --noprofile может использоваться, когда оболочка запущена, чтобы запретить это поведение.
Когда запускается интерактивная оболочка, которая не является оболочкой входа в систему, bash читает и выполняет команды из /etc/bash.bashrc и ~ /.bashrc, если эти файлы существуют. Это может быть запрещено с помощью параметра --norc. Опция --rcfile file заставит bash читать и выполнять команды из файла вместо /etc/bash.bashrc и ~/.bashrc.
Все это означает, что вы редактируете не тот файл. Вы можете проверить это, перейдя на виртуальную консоль с помощью Ctrl + Alt + F2 (вернитесь в GUI с Alt + F7 или F8 в зависимости от ваших настроек) и войдите в систему там. Вы увидите, что ваша подсказка и псевдонимы доступны.
Таким образом, чтобы параметр, который вы хотите применить, применялся к оболочкам, не входящим в систему, тип, который вы получаете при каждом открытии терминала, вы должны внести изменения в ~/.bashrc
вместо. Кроме того, вы также можете поместить свои псевдонимы в файл ~/.bash_aliases
(однако обратите внимание, что это функция Ubuntu, и вы не должны ожидать, что она будет работать в других дистрибутивах).
Подробнее о том, какой файл должен использоваться для чего, смотрите здесь.
ЗАМЕТКИ:
Debian (и, соответственно, Ubuntu) также имеет значение по умолчанию
~/.profile
источник~/.bashrc
, Это означает, что любые изменения, которые вы вносите в~/.bashrc
также будет наследоваться оболочками входа в систему, но i) это не относится ко всем машинам Linux/Unix и ii) обратное неверно, поэтому обычно вам следует всегда работать с~/.bashrc
&co, а не~/.profile
или же/etc/profile
,Кроме того, общее примечание по использованию, изменения, внесенные в файлы конфигурации в
/etc
повлияет на всех пользователей. Обычно это не то, что вы хотите сделать, и его следует избегать. Вы должны всегда использовать эквивалентные файлы в вашем домашнем каталоге (~/
).Различные файлы конфигурации читаются последовательно. В частности, для оболочек входа в систему, порядок:
/etc/profile -> /etc/profile.d/* (in alphabetical order) -> ~/.profile
Это означает, что любой параметр в
~/.profile
перезапишет все, что установлено в предыдущих файлах.
В Debian for Terminal session я решил эту проблему для всех пользователей так:
Добавлено в
sudo nano /etc/bash.bashrc
блок
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
от
/etc/profile
Следуйте по этому пути:
- Открыть Редактировать -> Настройки
- На первой вкладке "Общие" под меткой "Команда" включите "Запускать команду как оболочка входа"
Еще одна возможность, особенно для таких настроек, как настройки истории HISTSIZE
, HISTFILESIZE
, HISTCONTROL
, а также PS1
является то, что файлы загружаются, но настройки перезаписываются в другой файл, который является источником позже, с наиболее вероятной причиной ~/.bashrc
, (У меня есть набор настроек по умолчанию для наших серверов, например, приглашение root красного цвета для предупреждения пользователя и большие истории с отметками времени)
Ubuntu по умолчанию .bashrc
от /etc/skel
устанавливает несколько настроек, которые, возможно, имело бы смысл установить откуда-то, где он не будет переопределять настройки, установленные владельцем системы из /etc/profile.d
(Подобно /etc/bash.bashrc
) (Если пользователь редактирует свои .bashrc
можно переписать настройки, системные файлы по умолчанию более раздражают)
VERSION="16.04.3 LTS (Xenial Xerus)"
Итак, все предположили, что этот человек не хочет /etc/profile.d/somefile.sh для всех пользователей, но в моем случае это именно то, что я хотел.
Так что на самом деле, как выясняется с Ubuntu, если вы используете это и хотите, чтобы оно вступило в силу в вашей графической оболочке, все, что вам нужно сделать, это установить файл, а затем выйти и снова войти. Все ваши консоли или все, что вы запускаете, будь то тип xterm или тип консоли (или перенос в оболочку), теперь получат этот файл.
Не нужно использовать.bashrc и т. Д. Для всех пользователей. Извините, это просто не было ясно в ответе выше. Все, что они сказали, является правдой, но в действительности это в основном не соответствует действительности, поскольку все, что запускает менеджер окон, унаследует эти настройки, поэтому просто войдите в систему и решите свою проблему и не беспокойтесь о.bashrc и т. Д., Если вы хотите применить его ко всем пользователям.,