Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

Possible Duplicate:
Execute bash scripts on entering a directory

I am running an environment which requires some very specific tool versions. The commands to set up the environment are in a script called set_foo_env.sh

Suppose I have a directory ~/repository/foo/. Is is possible to run set_foo_env.sh as soon as I enter the foo directory?

share|improve this question

marked as duplicate by manatwork, Ulrich Dangel, jw013, jasonwryan, Patrick Jul 10 '12 at 21:52

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

    
The question, I accept might be similar. But one of the answers listed below here by @nsg is very interesting and novel. I am yet to try this solution out and rate it. I think this might work better than using aliasing cd although this is my personal opinion. Thanks for your comment though. –  boffin Jul 10 '12 at 15:57
3  
Depends on your goal. The PROMPT_COMMAND based solution will run the command after each command executed inside the specified directory. So if you do cd ~/repository/foo/, du -sch and date, then set_foo_env.sh will be executed 3 times. The cd aliasing solution will execute it only once. –  manatwork Jul 10 '12 at 16:22

2 Answers 2

You could use PROMPT_COMMAND, the code specified in PROMPT_COMMAND is executed before bash draws the prompt.

# Call function 'foo'
PROMPT_COMMAND=foo

# The function
foo() {
        if [[ $PWD == "$HOME/repository/foo" ]]; then
              set_foo_env.sh  
        fi
}

Note, PROMPT_COMMAND is bash specific, and this is not a efficient way because the function foo will be called every time bash draws the prompt.

share|improve this answer
2  
Shouldn't that be either "$HOME/repository/foo" or "/home/$USER/repository/foo"? And the trailing slash may be a problem, at least my bash sets $PWD without it. –  manatwork Jul 10 '12 at 16:16
1  
Also, this seems to be bash-specific. It doesn't work on my old ksh. –  rahmu Jul 10 '12 at 16:20
    
This isn't a good solution because it runs the command every time the prompt is displayed, not after a cd. –  Patrick Jul 10 '12 at 21:52
    
Yes, PROMT_COMMAND is bash-specific. The question contains the tags 'bash' so i assumed he was a bash user. The cd-function trick suggested by Arcege may be a better solution, note the possible security concern stated by jw013. –  nsg Jul 12 '12 at 12:40
    
manatwork: true, I will update my answer. –  nsg Jul 12 '12 at 12:41

Change the cd into a function to run the real cd and run your script afterward.

cd () {
    if builtin cd ${1:+"$@"} && [ -r ./set_foo_env.sh ]; then
        . ./set_foo_env.sh
    fi
}

This assumes that:

  1. The set_foo_env.sh would be specific to a single directories, and
  2. That set_foo_env.sh should change the existing shell's environment.

If you want path-based with a global file, then look at the question that manatwork mentioned ( Execute bash scripts on entering a directory).

share|improve this answer
    
It should be mentioned that this particular implementation does open up a serious security hole. Never cd to any directory other users can drop files into (like a dropbox or Public directory, e.g. rm -f ~you/Public/set_foo_env.sh; echo $'#!/bin/sh\nchmod -R 777 ~' > ~you/Public/set_foo_env.sh). –  jw013 Jul 10 '12 at 17:30

Not the answer you're looking for? Browse other questions tagged or ask your own question.