I'm new to Ubuntu. I'm running 13.10 Desktop.
I wanted to set some system wide aliases and a custom prompt for bash. I found this article:
https://help.ubuntu.com/community/EnvironmentVariables
Following the advice in this article, I created /etc/profile.d/profile_local.sh. It is owned by root and has permissions of 644 just like the other scripts there:
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
I have further confirmed that /etc/profile calls /etc/profile.d. It contains this code block:
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
Upon login, it does not appear that the custom script, profile_local.sh I created gets sourced. However if after login I 'source /etc.profile.d/profile_local.sh', I get the expected behavior, my custom aliases, and custom prompt.
What am I doing wrong?
Contents of 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
-- Apparently comments are limited in length. I'll get the script posted as soon as I figure out how.
– Drew Mar 23 '14 at 17:07<code> </code>
around the code but the formatting isn't working. Not sure how to fix. – Drew Mar 23 '14 at 17:21#!/bin/bash
at the top. – Mr.Lee Mar 23 '14 at 17:32However I did try adding and tested. No change.
– Drew Mar 23 '14 at 17:34/etc/bash.bashrc
– Mr.Lee Mar 23 '14 at 17:41.sh
, it is irrelevant and anyway the files inprofile.d
are sourced, not executed which is slightly different and does not require the file to be executable. The issue here is thatprofile
&co are not read by non-login scripts. – terdon Mar 23 '14 at 17:41I found this line in /etc/bash.bashrc:
# set a fancy prompt (non-color, overwrite the one in /etc/profile) PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
But even after commenting out, I still don't get my custom PS1.
So there is something about the script that doesn't set PS1 when called upon login but works if sourced after login.
– Drew Mar 23 '14 at 17:44.bashrc
and all your problems will go away. There is also a question of precedence, if one of the files that are read subsequently also sets PS1, then the previous value will be discarded. Anyway, seriously, don't touch the filers in/etc
, play with the ones in your home dir and use.bashrc
not profile. – terdon Mar 23 '14 at 17:46.profile
files in your home and the settings there will overwrite anything you do in/etc/profile
. Basically never touch/etc
unless you know what you're doing. That's what the user-specific files are for. Also, please [edit] your question and explain exactly how you are connecting, that changes everything. – terdon Mar 23 '14 at 17:52/etc/profile.d
that is a really bad idea and will affect all users of the system. Just include the commands fromprofile_local.sh
in your~/.profile
or simply source the script by adding this line to your~/.profile
:. /path/to/profile_local.sh
. (the.
meanssource
, it will read the file you give it and run the commands it finds there). – terdon Mar 23 '14 at 17:57Thanks for your detailed explanation of how it all works. It is very helpful.
– Drew Mar 23 '14 at 18:03