I want to understand bash better

Hi everyone,

I have some questions regarding bash and my initializer files:

  1. when I look at my bashrc file, I see lots of "export".. export MAGICK_HOME="$HOME/bin..etc".. what does export really mean?
  2. in my bashrc, I have a line: "umask 0002" ... what does that do?
  3. I have a bash_profile which apparently i not being called when I open a new terminal window in x11. (it has echo "welcome" stuff that I never see). Also in it, I have: if [ -f ~/.bashrc ]; then . ~/.bashrc fi --- what does that mean?.. Also, it has PATH=$HOME/bin:$PATH .. which my bashrc file also had PATH=... so, should only one of these files have path and export in it?
  4. since my bash_profile wasn't being read, I added to my bashrc file (which is being read) . ~/.bash_profile ... when I opened a new window, my greeting message in bash_profile repeated over and over and over and over until I hit ctrl-c.. Why is it looping that?

thank you.

-patrick

Points 1, 2 and 3:

From the bash manpage:

       export [-fn] [name[=word]] ...
       export -p
              The  supplied  names  are  marked for automatic export to the environment of
              subsequently executed commands.  If the -f option is given, the names  refer
              to  functions.   If  no  names are given, or if the -p option is supplied, a
              list of all names that are exported in this shell is printed.  The -n option
              causes the export property to be removed from each name.  If a variable name
              is followed by =word, the value of the variable  is  set  to  word.   export
              returns  an exit status of 0 unless an invalid option is encountered, one of
              the names is not a valid shell variable name, or -f is supplied with a  name
              that is not a function.


       umask [-p] [-S] [mode]
              The user file-creation mask is set to mode.  If mode begins with a digit, it
              is interpreted as an octal number; otherwise it is interpreted as a symbolic
              mode mask similar to that accepted by chmod(1).  If  mode  is  omitted,  the
              current  value  of the mask is printed.  The -S option causes the mask to be
              printed in symbolic form; the default output is an octal number.  If the  -p
              option is supplied, and mode is omitted, the output is in a form that may be
              reused as input.  The return status  is  0  if  the  mode  was  successfully
              changed or if no mode argument was supplied, and false otherwise.


       --noprofile
              Do not read either the system-wide startup file /etc/profile or any  of  the
              personal initialization files ~/.bash_profile, ~/.bash_login, or ~/.profile.
              By default, bash reads these files when it is invoked as a login shell...

As to point 4, you said in point 3 that your .bash_profile called .bashrc. So when you called your .bash_profile from your .bashrc, .bash_profile called .bashrc. And .bashrc called .bash_profile, which called....

Hi,

Thank you for your reply.. Unfortunately reading those man entries did not explain anything to me. I just am not familiar with the terminology I guess..

What does that mean??? I read that paragraph 5 times and I have no idea what I am reading. Could you please give me some examples of what exporting does and how it's useful?

what is a "file-creation mask"? I googled this and the best I could find was that it sets the default permissions for a file.. But that umask line is set to 0002.. which is no permission I've ever seen before.. I'm used to seeing chmod 644, 755, 777, etc.. ?

So, ok that made sense.. I realized that I needed to set x11 to do "xterm -ls" and that fixed it.

Ok, so is it normal for bash_profile to call bashrc? Or should I remove that from my bashrc?

thank you.
-patrick

  1. export: make sure that commands in subshells can read the exported variable.
  2. umask: set default file permissions for new created files&directories; umask 002 means your default file permission is 664, and 775 for directories.

Exporting a variable puts it into the environment so that child processes can see it.

If you set a variable in a script (script1), then call another script (script2), script2 will no know about the variable unless it has been exported.

It's a mask; in other words, if a bit is set in the mask, it will be turned off in a file when it is created.

It is common for .bash_profile to call .bashrc, which means that you do not want to call .bash_profile from .bashrc or you will get an infinite loop.

ok, thank you for the replies... I now understand export.. It's essentially making a variable global... Now my question is, in my bashrc I have:

export MAGICK_HOME="$HOME/bin/ImageMagick-6.3.7/"

export PATH=~/bin:$PATH:/usr/local/bin:/opt/local/bin:/usr/X11R6/bin:/bin:$MAGIC
export MANPATH=/usr/share/man:/usr/local/man:/usr/X11R6/man:/opt/local/share/man
export INFOPATH=/opt/local/share/info

export DYLD_LIBRARY_PATH="$MAGICK_HOME/lib"

export TZ=/usr/share/zoneinfo/America/Los_Angeles

test -r /sw/bin/init.sh && . /sw/bin/init.sh

What is the purpose of exporting these variables? What is referencing MANPATH, INFOPATH, MAGICK_HOME, DYLD_LIBRARY_PATH? Are these necessary to have? the test -r line.. I know that is something that my fink installer added-- so I guess I want that, but what does that mean exactly?

.. Ok-- so, if I don't have this umask 0002 line, what would my permissions be set to? Is it standard to have this line in your bashrc, and is 0002 the best thing to have it set to?

thank you very much for the help and explanations.

-patrick

MANPATH is used by the man command.

INFOPATH is used by the info command.

MAGICK_HOME is used by the ImageMack set of commands.

I don't know.

If you want to use man, info and ImageMagick, they probably are necessary.

Use the help command:

help test