Je suis nouveau sur Ubuntu. J'exécute 13.10 Desktop.
Je voulais définir des alias système et une invite personnalisée pour bash. J'ai trouvé cet article:
https://help.ubuntu.com/community/EnvironmentVariables
En suivant les conseils de cet article, j'ai créé /etc/profiles.d/profile_local.sh. Il est la propriété de root et possède les autorisations de 644, tout comme les autres scripts de cet emplacement:
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
J'ai également confirmé que / etc / profile appelle /etc/profile.d. Il contient ce bloc de code:
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
Lors de la connexion, il ne semble pas que le script personnalisé profile_local.sh que j'ai créé soit identifié. Toutefois, si, après la connexion, je source /etc.profile.d/profile_local.sh, le comportement attendu, mes alias personnalisés et mes invites personnalisées me sont fournis.
Qu'est-ce que je fais mal?
Contenu du 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 "\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
.sh
, ce n'est pas pertinent et, de toute façon, les fichiers profile.d
sont générés, pas exécutés, ce qui est légèrement différent et n'exige pas que le fichier soit exécutable. Le problème ici est que profile
& co ne sont pas lus par des scripts non-login.
.bashrc
et tous vos problèmes disparaîtront. Il y a aussi une question de priorité: si l'un des fichiers lus par la suite définit également PS1, la valeur précédente sera alors ignorée. Quoi qu'il en soit, sérieusement, ne touchez pas les utilisateurs /etc
, jouez avec ceux de votre répertoire personnel et n'utilisez .bashrc
pas de profil.
.profile
fichiers par défaut dans votre maison et les paramètres qu’ils remplacent écrasent tout ce que vous faites /etc/profile
. En gros, ne touchez jamais à/etc
moins de savoir ce que vous faites. C'est à cela que servent les fichiers spécifiques à l'utilisateur. Aussi, veuillez modifier votre question et expliquer comment vous vous connectez, cela change tout.
/etc/profile.d
c'est une très mauvaise idée et affectera tous les utilisateurs du système. Il suffit d' inclure les commandes de profile_local.sh
votre ~/.profile
ou simplement la source du script en ajoutant cette ligne à votre ~/.profile
: . /path/to/profile_local.sh
. (le .
moyen source
, il va lire le fichier que vous lui donnez et exécuter les commandes qu'il y trouve).