Slackware This Forum is for the discussion of Slackware Linux.
|
Notices |
Welcome to LinuxQuestions.org, a friendly and active Linux Community.
You are currently viewing LQ as a guest. By joining our community you will have the ability to post topics, receive our newsletter, use the advanced search, subscribe to threads and access many other special features. Registration is quick, simple and absolutely free. Join our community today!
Note that registered members see fewer ads, and ContentLink is completely disabled once you log in.
Are you new to LinuxQuestions.org? Visit the following links:
Site Howto |
Site FAQ |
Sitemap |
Register Now
If you have any problems with the registration process or your account login, please contact us. If you need to reset your password, click here.
Having a problem logging in? Please visit this page to clear all LQ-related cookies.
Get a virtual cloud desktop with the Linux distro that you want in less than five minutes with Shells! With over 10 pre-installed distros to choose from, the worry-free installation life is here! Whether you are a digital nomad or just looking for flexibility, Shells can put your Linux machine on the device that you want to use.
Exclusive for LQ members, get up to 45% off per month. Click here for more info.
|
 |
07-21-2009, 05:08 AM
|
#1
|
Member
Registered: Sep 2006
Posts: 366
Rep:
|
Enviroment variables in .bash_profile
Hey all,
I have a weird problem. In my /~/.bash_profile file I have this:
Code:
ADA_PROJECT_PATH=$ADA_PROJECT_PATH:/usr/local/lib/gnat
export ADA_PROJECT_PATH
I boot to runlevel 3. When I log in, and echo $ADA_PROJECT_PATH, I get this:
Code:
:/usr/local/lib/gnat
Which is exactly what I should get.
But if I then run startx (I use KDE), and start a Konsole and echo $ADA_PROJECT_PATH again, I get this:
Code:
:/usr/local/lib/gnat:/usr/local/lib/gnat
What the?? Why are there now two paths??
Booting to runlevel 4 changes nothing. As soon as KDE is up and running, I have multiple paths, instead of just the one I'm actually exporting in .bash_profile.
Hopefully this is just some minor thing I'm not doing right, but it's completely eluding me.
I hope someone can help.
/Thomas
|
|
|
07-21-2009, 05:22 AM
|
#2
|
LQ Newbie
Registered: Aug 2008
Location: Philippines
Distribution: LFS, Slackware, Slamd64
Posts: 6
Rep:
|
i think it should be;
Code:
ADA_PROJECT_PATH=/usr/local/lib/gnat
export ADA_PROJECT_PATH
|
|
|
07-21-2009, 05:47 AM
|
#3
|
Member
Registered: Sep 2006
Posts: 366
Original Poster
Rep:
|
Quote:
Originally Posted by dahongpalay
i think it should be;
Code:
ADA_PROJECT_PATH=/usr/local/lib/gnat
export ADA_PROJECT_PATH
|
Yes, but how can I then preserve additional paths added to the variable?
Code:
ADA_PROJECT_PATH=$ADA_PROJECT_PATH:/usr/local/lib/gnat
ADA_PROJECT_PATH=$ADA_PROJECT_PATH:/some/other/path
ADA_PROJECT_PATH=$ADA_PROJECT_PATH:/and/a/third/path
Without the $ADA_PROJECT_PATH part, that will fail, and only the last path is added to ADA_PROJECT_PATH.
|
|
|
07-21-2009, 06:05 AM
|
#4
|
Member
Registered: Sep 2006
Posts: 366
Original Poster
Rep:
|
Quote:
Originally Posted by dahongpalay
i think it should be;
Code:
ADA_PROJECT_PATH=/usr/local/lib/gnat
export ADA_PROJECT_PATH
|
I've just confirmed this: If I dump the $ADA_PROJECT_PATH: part, then the paths set in /etc/profile are deleted/written over.
It is a mystery to me why my bash_profile files are being sourced more than once, and why it appears only to happen when i start X.
|
|
|
07-21-2009, 08:58 AM
|
#5
|
Moderator
Registered: Jan 2005
Location: Central Florida 20 minutes from Disney World
Distribution: SlackwareŽ
Posts: 13,971
|
Hi,
Quote:
excerpt from '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 a login shell exits, bash reads and executes commands from the file ~/.bash_logout, if it exists.
When an interactive shell that is not a login shell is started, bash reads and executes commands from ~/.bashrc, if that file exists. 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 ~/.bashrc.
|
Try placing your path in '.bashrc'.
You could setup a .bashrc & .bash_profile for your user;
Code:
sample .bash_profile;
~$ cat .bash_profile
# .bash_profile
#08-30-06 12:21
#
# Source .bashrc
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
Code:
sample .bashrc;
:~$ cat .bashrc
#.bashrc
#08-30-06 12:20
# Add bin to path
export PATH="$PATH:/sbin:/usr/sbin:$HOME/bin"
#export PATH="$PATH:$HOME/bin"
# Dynamic resizing
shopt -s checkwinsize
# Custom prompt
#PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
#08-29-06 11:40 gws
if [ `id -un` = root ]; then
PS1='\[\033[1;31m\]\h:\w\$\[\033[0m\] '
else
PS1='\[\033[1;32m\]\h:\w\$\[\033[0m\] '
fi
#
# Add color
eval `dircolors -b`
# User defined aliases
alias cls='clear'
alias clls='clear; ls'
alias ll='ls -l'
alias lsa='ls -A'
alias lsg='ls | grep'
alias lsp='ls -1 /var/log/packages/ > package-list'
alias na='nano'
alias web='links -g -download-dir ~/ www.google.com'
#08-29-06 11:50
#To clean up and cover your tracks once you log off
#Depending on your version of BASH, you might have to use
# the other form of this command
trap "rm -f ~$LOGNAME/.bash_history" 0
#The older KSH-style form
# trap 0 rm -f ~$LOGNAME/.bash_history
|
|
|
07-21-2009, 02:10 PM
|
#6
|
Member
Registered: Apr 2008
Location: China, Beijing
Distribution: Slackware
Posts: 423
Rep:
|
I just wonder whether Konsole is a login shell or not. I remember I have had such problem in KDE3...
|
|
|
07-21-2009, 02:13 PM
|
#7
|
LQ Newbie
Registered: Apr 2009
Location: Kharkiv, UA
Distribution: Slackware
Posts: 19
Rep:
|
Well, .bash_profile is executed after you log in to the system - that's when you enter your username and password at the console _and_ when you start your shell in Konsole as a login shell (seems it is so by default - can't check though, I don't use KDE).
So, when you initially log in to the system, .bash_profile sets ADA_PROJECT_PATH to ":/usr/local/lib/gnat". Then you fire up KDE and Konsole executes bash again - but in this case ADA_PROJECT_PATH is already in your environment so it gets expanded and the value is "duplicated".
On the other hand, .bashrc is executed every time the bash is run so moving your ADA_PROJ_PATH routine there will duplicate the variable as well. If it really creates any problems you can try smth like that:
Code:
[ -z "$ADA_PROJECT_PATH_SET"] && export ADA_PROJECT_PATH=$ADA_PROJECT_PATH:/usr/local/lib/gnat
export ADA_PROJECT_PATH_SET=1
in your .bash_profile. This will set ADA_PROJECT_PATH_SET variable upon initial login and then bash invoked from Konsole will skip the assigment.
But better way will be to make Konsole invoke bash in regular, not "login shell" mode.
|
|
|
07-21-2009, 03:21 PM
|
#8
|
Moderator
Registered: Jan 2005
Location: Central Florida 20 minutes from Disney World
Distribution: SlackwareŽ
Posts: 13,971
|
Hi,
Sorry but the '/etc/profile' will be used if it exists so when you login initially when bash is invoked then the use of ~/.bash_profile, ~/.bash_login, and ~/.profile is read until something that is read and executable then that is executed;
Quote:
excerpt from '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 a login shell exits, bash reads and executes commands from the file ~/.bash_logout, if it exists.
When an interactive shell that is not a login shell is started, bash reads and executes commands from ~/.bashrc, if that file exists. 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 ~/.bashrc.
|
A user should setup the '.bashrc' whenever the interactive is not a login shell.
That's one of the advantages of using a '~/.bash_profile' that contains conditional tests to execute the '~/.bashrc'.
|
|
|
07-22-2009, 02:00 AM
|
#9
|
Member
Registered: Sep 2006
Posts: 366
Original Poster
Rep:
|
Quote:
Originally Posted by jmacloue
Well, .bash_profile is executed after you log in to the system - that's when you enter your username and password at the console _and_ when you start your shell in Konsole as a login shell (seems it is so by default - can't check though, I don't use KDE).
So, when you initially log in to the system, .bash_profile sets ADA_PROJECT_PATH to ":/usr/local/lib/gnat". Then you fire up KDE and Konsole executes bash again - but in this case ADA_PROJECT_PATH is already in your environment so it gets expanded and the value is "duplicated".
On the other hand, .bashrc is executed every time the bash is run so moving your ADA_PROJ_PATH routine there will duplicate the variable as well. If it really creates any problems you can try smth like that:
Code:
[ -z "$ADA_PROJECT_PATH_SET"] && export ADA_PROJECT_PATH=$ADA_PROJECT_PATH:/usr/local/lib/gnat
export ADA_PROJECT_PATH_SET=1
in your .bash_profile. This will set ADA_PROJECT_PATH_SET variable upon initial login and then bash invoked from Konsole will skip the assigment.
|
This looks like a very neat and tidy way of fixing a somewhat annoying issue. Thank you.
Quote:
Originally Posted by jmacloue
But better way will be to make Konsole invoke bash in regular, not "login shell" mode.
|
AFAIK that is standard behavior for Konsole. I think you have to explicitly tell it to start as a login shell (the --ls option), if that's what you want.
So the only other thing I can come up with, is that it happens when X and/or KDE is started.
/Thomas
|
|
|
All times are GMT -5. The time now is 11:45 PM.
|
LinuxQuestions.org is looking for people interested in writing
Editorials, Articles, Reviews, and more. If you'd like to contribute
content, let us know.
|
Latest Threads
LQ News
|
|