Execute bash scripts on entering a directory
Clash Royale CLAN TAG#URR8PPP
up vote
35
down vote
favorite
What is the best way to execute a script when entering into a directory?
When I move into a new directory I would like bash to execute the projectSettings.bash script much like RVM does.
bash shell-script cd-command
add a comment |Â
up vote
35
down vote
favorite
What is the best way to execute a script when entering into a directory?
When I move into a new directory I would like bash to execute the projectSettings.bash script much like RVM does.
bash shell-script cd-command
2
Into every directory, or selected ones? And the same script for each, or not?
â enzotib
Sep 24 '11 at 19:50
Every directory. The script in the directory named projectSettings.bash if it exists.
â Prospero
Sep 24 '11 at 19:54
Similar question on Stack Overflow
â Gilles
Feb 26 '15 at 23:41
add a comment |Â
up vote
35
down vote
favorite
up vote
35
down vote
favorite
What is the best way to execute a script when entering into a directory?
When I move into a new directory I would like bash to execute the projectSettings.bash script much like RVM does.
bash shell-script cd-command
What is the best way to execute a script when entering into a directory?
When I move into a new directory I would like bash to execute the projectSettings.bash script much like RVM does.
bash shell-script cd-command
bash shell-script cd-command
edited Sep 24 '11 at 19:53
Gilles
509k12010061535
509k12010061535
asked Sep 24 '11 at 19:39
Prospero
1,74062445
1,74062445
2
Into every directory, or selected ones? And the same script for each, or not?
â enzotib
Sep 24 '11 at 19:50
Every directory. The script in the directory named projectSettings.bash if it exists.
â Prospero
Sep 24 '11 at 19:54
Similar question on Stack Overflow
â Gilles
Feb 26 '15 at 23:41
add a comment |Â
2
Into every directory, or selected ones? And the same script for each, or not?
â enzotib
Sep 24 '11 at 19:50
Every directory. The script in the directory named projectSettings.bash if it exists.
â Prospero
Sep 24 '11 at 19:54
Similar question on Stack Overflow
â Gilles
Feb 26 '15 at 23:41
2
2
Into every directory, or selected ones? And the same script for each, or not?
â enzotib
Sep 24 '11 at 19:50
Into every directory, or selected ones? And the same script for each, or not?
â enzotib
Sep 24 '11 at 19:50
Every directory. The script in the directory named projectSettings.bash if it exists.
â Prospero
Sep 24 '11 at 19:54
Every directory. The script in the directory named projectSettings.bash if it exists.
â Prospero
Sep 24 '11 at 19:54
Similar question on Stack Overflow
â Gilles
Feb 26 '15 at 23:41
Similar question on Stack Overflow
â Gilles
Feb 26 '15 at 23:41
add a comment |Â
2 Answers
2
active
oldest
votes
up vote
46
down vote
accepted
You can make cd
a function (and pop
and pushd
), and make it detect if you enter that particular directory.
cd () builtin cd "$@" && chpwd;
pushd () builtin pushd "$@" && chpwd;
popd () builtin popd "$@" && chpwd;
unset_all_project_settings ()
# do whatever it takes to undo the effect of projectSettings.bash,
# e.g. unset variables, remove PATH elements, etc.
chpwd () /some/other/directory) . ./projectSettings.bash;;
*) unset_all_project_settings;;
esac
Do not do this in directories that you haven't whitelisted, because it would make it very easy for someone to trick you into running arbitrary code â send you an archive, so you unzip it, change into the directory it created, and you've now run the attacker's code.
I don't recommend this approach, because it means the script will be executed even if you enter that directory for some reason that's unrelated to working on the project. I suggest having a specific function that changes to the project directory and sources the settings script.
myproj ()
cd /some/directory && . ./projectSettings.bash
1
I only started in Ruby a little while ago. The RVM tool tho is completely in Bash and one of the best pieces of Bash magic I have seen. I think the answer is a little silly because one of the absolutely worse things you can ever do is over ride something likecd
and there is with out doubt a better way. Even using $PROMPT_COMMAND is better!
â Prospero
Oct 2 '11 at 23:21
1
I was completely wrong and apologize. RVM was overloading cd.
â Prospero
Oct 7 '11 at 14:22
5
(removed some tangential pro/anti-Ruby stuff from this comment thread)
â Michael Mrozekâ¦
Jul 25 '12 at 21:04
1
in the projectSettings.bash I suggest you to add a flag variable to not repeat the initialization in case you exit/re-enter the directory. So enclose everything inif [ -z $MYSETTINGS ] ; then export MYSETTINGS=1 ; echo your settings here ; fi
. This is to avoid problems in case you do something PATH=/mytools/bin:$PATH kind of initialisation.
â spider
Sep 18 '15 at 9:57
5
@spider Rather there should be some kind of unset mechanism if you leave the directory. If you leave and reenter, you should get the settings back!
â Gilles
Sep 18 '15 at 10:11
 |Â
show 4 more comments
up vote
0
down vote
direnv might be what you are looking for.
Here is an example taken from the official documentation:
$ cd ~/my_project
$ echo $FOO-nope
nope
$ echo export FOO=foo > .envrc
.envrc is not allowed
$ direnv allow .
direnv: reloading
direnv: loading .envrc
direnv export: +FOO
$ echo $FOO-nope
foo
$ cd ..
direnv: unloading
direnv export: ~PATH
$ echo $FOO-nope
nope
add a comment |Â
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
46
down vote
accepted
You can make cd
a function (and pop
and pushd
), and make it detect if you enter that particular directory.
cd () builtin cd "$@" && chpwd;
pushd () builtin pushd "$@" && chpwd;
popd () builtin popd "$@" && chpwd;
unset_all_project_settings ()
# do whatever it takes to undo the effect of projectSettings.bash,
# e.g. unset variables, remove PATH elements, etc.
chpwd () /some/other/directory) . ./projectSettings.bash;;
*) unset_all_project_settings;;
esac
Do not do this in directories that you haven't whitelisted, because it would make it very easy for someone to trick you into running arbitrary code â send you an archive, so you unzip it, change into the directory it created, and you've now run the attacker's code.
I don't recommend this approach, because it means the script will be executed even if you enter that directory for some reason that's unrelated to working on the project. I suggest having a specific function that changes to the project directory and sources the settings script.
myproj ()
cd /some/directory && . ./projectSettings.bash
1
I only started in Ruby a little while ago. The RVM tool tho is completely in Bash and one of the best pieces of Bash magic I have seen. I think the answer is a little silly because one of the absolutely worse things you can ever do is over ride something likecd
and there is with out doubt a better way. Even using $PROMPT_COMMAND is better!
â Prospero
Oct 2 '11 at 23:21
1
I was completely wrong and apologize. RVM was overloading cd.
â Prospero
Oct 7 '11 at 14:22
5
(removed some tangential pro/anti-Ruby stuff from this comment thread)
â Michael Mrozekâ¦
Jul 25 '12 at 21:04
1
in the projectSettings.bash I suggest you to add a flag variable to not repeat the initialization in case you exit/re-enter the directory. So enclose everything inif [ -z $MYSETTINGS ] ; then export MYSETTINGS=1 ; echo your settings here ; fi
. This is to avoid problems in case you do something PATH=/mytools/bin:$PATH kind of initialisation.
â spider
Sep 18 '15 at 9:57
5
@spider Rather there should be some kind of unset mechanism if you leave the directory. If you leave and reenter, you should get the settings back!
â Gilles
Sep 18 '15 at 10:11
 |Â
show 4 more comments
up vote
46
down vote
accepted
You can make cd
a function (and pop
and pushd
), and make it detect if you enter that particular directory.
cd () builtin cd "$@" && chpwd;
pushd () builtin pushd "$@" && chpwd;
popd () builtin popd "$@" && chpwd;
unset_all_project_settings ()
# do whatever it takes to undo the effect of projectSettings.bash,
# e.g. unset variables, remove PATH elements, etc.
chpwd () /some/other/directory) . ./projectSettings.bash;;
*) unset_all_project_settings;;
esac
Do not do this in directories that you haven't whitelisted, because it would make it very easy for someone to trick you into running arbitrary code â send you an archive, so you unzip it, change into the directory it created, and you've now run the attacker's code.
I don't recommend this approach, because it means the script will be executed even if you enter that directory for some reason that's unrelated to working on the project. I suggest having a specific function that changes to the project directory and sources the settings script.
myproj ()
cd /some/directory && . ./projectSettings.bash
1
I only started in Ruby a little while ago. The RVM tool tho is completely in Bash and one of the best pieces of Bash magic I have seen. I think the answer is a little silly because one of the absolutely worse things you can ever do is over ride something likecd
and there is with out doubt a better way. Even using $PROMPT_COMMAND is better!
â Prospero
Oct 2 '11 at 23:21
1
I was completely wrong and apologize. RVM was overloading cd.
â Prospero
Oct 7 '11 at 14:22
5
(removed some tangential pro/anti-Ruby stuff from this comment thread)
â Michael Mrozekâ¦
Jul 25 '12 at 21:04
1
in the projectSettings.bash I suggest you to add a flag variable to not repeat the initialization in case you exit/re-enter the directory. So enclose everything inif [ -z $MYSETTINGS ] ; then export MYSETTINGS=1 ; echo your settings here ; fi
. This is to avoid problems in case you do something PATH=/mytools/bin:$PATH kind of initialisation.
â spider
Sep 18 '15 at 9:57
5
@spider Rather there should be some kind of unset mechanism if you leave the directory. If you leave and reenter, you should get the settings back!
â Gilles
Sep 18 '15 at 10:11
 |Â
show 4 more comments
up vote
46
down vote
accepted
up vote
46
down vote
accepted
You can make cd
a function (and pop
and pushd
), and make it detect if you enter that particular directory.
cd () builtin cd "$@" && chpwd;
pushd () builtin pushd "$@" && chpwd;
popd () builtin popd "$@" && chpwd;
unset_all_project_settings ()
# do whatever it takes to undo the effect of projectSettings.bash,
# e.g. unset variables, remove PATH elements, etc.
chpwd () /some/other/directory) . ./projectSettings.bash;;
*) unset_all_project_settings;;
esac
Do not do this in directories that you haven't whitelisted, because it would make it very easy for someone to trick you into running arbitrary code â send you an archive, so you unzip it, change into the directory it created, and you've now run the attacker's code.
I don't recommend this approach, because it means the script will be executed even if you enter that directory for some reason that's unrelated to working on the project. I suggest having a specific function that changes to the project directory and sources the settings script.
myproj ()
cd /some/directory && . ./projectSettings.bash
You can make cd
a function (and pop
and pushd
), and make it detect if you enter that particular directory.
cd () builtin cd "$@" && chpwd;
pushd () builtin pushd "$@" && chpwd;
popd () builtin popd "$@" && chpwd;
unset_all_project_settings ()
# do whatever it takes to undo the effect of projectSettings.bash,
# e.g. unset variables, remove PATH elements, etc.
chpwd () /some/other/directory) . ./projectSettings.bash;;
*) unset_all_project_settings;;
esac
Do not do this in directories that you haven't whitelisted, because it would make it very easy for someone to trick you into running arbitrary code â send you an archive, so you unzip it, change into the directory it created, and you've now run the attacker's code.
I don't recommend this approach, because it means the script will be executed even if you enter that directory for some reason that's unrelated to working on the project. I suggest having a specific function that changes to the project directory and sources the settings script.
myproj ()
cd /some/directory && . ./projectSettings.bash
edited Sep 18 '15 at 10:12
answered Sep 24 '11 at 19:52
Gilles
509k12010061535
509k12010061535
1
I only started in Ruby a little while ago. The RVM tool tho is completely in Bash and one of the best pieces of Bash magic I have seen. I think the answer is a little silly because one of the absolutely worse things you can ever do is over ride something likecd
and there is with out doubt a better way. Even using $PROMPT_COMMAND is better!
â Prospero
Oct 2 '11 at 23:21
1
I was completely wrong and apologize. RVM was overloading cd.
â Prospero
Oct 7 '11 at 14:22
5
(removed some tangential pro/anti-Ruby stuff from this comment thread)
â Michael Mrozekâ¦
Jul 25 '12 at 21:04
1
in the projectSettings.bash I suggest you to add a flag variable to not repeat the initialization in case you exit/re-enter the directory. So enclose everything inif [ -z $MYSETTINGS ] ; then export MYSETTINGS=1 ; echo your settings here ; fi
. This is to avoid problems in case you do something PATH=/mytools/bin:$PATH kind of initialisation.
â spider
Sep 18 '15 at 9:57
5
@spider Rather there should be some kind of unset mechanism if you leave the directory. If you leave and reenter, you should get the settings back!
â Gilles
Sep 18 '15 at 10:11
 |Â
show 4 more comments
1
I only started in Ruby a little while ago. The RVM tool tho is completely in Bash and one of the best pieces of Bash magic I have seen. I think the answer is a little silly because one of the absolutely worse things you can ever do is over ride something likecd
and there is with out doubt a better way. Even using $PROMPT_COMMAND is better!
â Prospero
Oct 2 '11 at 23:21
1
I was completely wrong and apologize. RVM was overloading cd.
â Prospero
Oct 7 '11 at 14:22
5
(removed some tangential pro/anti-Ruby stuff from this comment thread)
â Michael Mrozekâ¦
Jul 25 '12 at 21:04
1
in the projectSettings.bash I suggest you to add a flag variable to not repeat the initialization in case you exit/re-enter the directory. So enclose everything inif [ -z $MYSETTINGS ] ; then export MYSETTINGS=1 ; echo your settings here ; fi
. This is to avoid problems in case you do something PATH=/mytools/bin:$PATH kind of initialisation.
â spider
Sep 18 '15 at 9:57
5
@spider Rather there should be some kind of unset mechanism if you leave the directory. If you leave and reenter, you should get the settings back!
â Gilles
Sep 18 '15 at 10:11
1
1
I only started in Ruby a little while ago. The RVM tool tho is completely in Bash and one of the best pieces of Bash magic I have seen. I think the answer is a little silly because one of the absolutely worse things you can ever do is over ride something like
cd
and there is with out doubt a better way. Even using $PROMPT_COMMAND is better!â Prospero
Oct 2 '11 at 23:21
I only started in Ruby a little while ago. The RVM tool tho is completely in Bash and one of the best pieces of Bash magic I have seen. I think the answer is a little silly because one of the absolutely worse things you can ever do is over ride something like
cd
and there is with out doubt a better way. Even using $PROMPT_COMMAND is better!â Prospero
Oct 2 '11 at 23:21
1
1
I was completely wrong and apologize. RVM was overloading cd.
â Prospero
Oct 7 '11 at 14:22
I was completely wrong and apologize. RVM was overloading cd.
â Prospero
Oct 7 '11 at 14:22
5
5
(removed some tangential pro/anti-Ruby stuff from this comment thread)
â Michael Mrozekâ¦
Jul 25 '12 at 21:04
(removed some tangential pro/anti-Ruby stuff from this comment thread)
â Michael Mrozekâ¦
Jul 25 '12 at 21:04
1
1
in the projectSettings.bash I suggest you to add a flag variable to not repeat the initialization in case you exit/re-enter the directory. So enclose everything in
if [ -z $MYSETTINGS ] ; then export MYSETTINGS=1 ; echo your settings here ; fi
. This is to avoid problems in case you do something PATH=/mytools/bin:$PATH kind of initialisation.â spider
Sep 18 '15 at 9:57
in the projectSettings.bash I suggest you to add a flag variable to not repeat the initialization in case you exit/re-enter the directory. So enclose everything in
if [ -z $MYSETTINGS ] ; then export MYSETTINGS=1 ; echo your settings here ; fi
. This is to avoid problems in case you do something PATH=/mytools/bin:$PATH kind of initialisation.â spider
Sep 18 '15 at 9:57
5
5
@spider Rather there should be some kind of unset mechanism if you leave the directory. If you leave and reenter, you should get the settings back!
â Gilles
Sep 18 '15 at 10:11
@spider Rather there should be some kind of unset mechanism if you leave the directory. If you leave and reenter, you should get the settings back!
â Gilles
Sep 18 '15 at 10:11
 |Â
show 4 more comments
up vote
0
down vote
direnv might be what you are looking for.
Here is an example taken from the official documentation:
$ cd ~/my_project
$ echo $FOO-nope
nope
$ echo export FOO=foo > .envrc
.envrc is not allowed
$ direnv allow .
direnv: reloading
direnv: loading .envrc
direnv export: +FOO
$ echo $FOO-nope
foo
$ cd ..
direnv: unloading
direnv export: ~PATH
$ echo $FOO-nope
nope
add a comment |Â
up vote
0
down vote
direnv might be what you are looking for.
Here is an example taken from the official documentation:
$ cd ~/my_project
$ echo $FOO-nope
nope
$ echo export FOO=foo > .envrc
.envrc is not allowed
$ direnv allow .
direnv: reloading
direnv: loading .envrc
direnv export: +FOO
$ echo $FOO-nope
foo
$ cd ..
direnv: unloading
direnv export: ~PATH
$ echo $FOO-nope
nope
add a comment |Â
up vote
0
down vote
up vote
0
down vote
direnv might be what you are looking for.
Here is an example taken from the official documentation:
$ cd ~/my_project
$ echo $FOO-nope
nope
$ echo export FOO=foo > .envrc
.envrc is not allowed
$ direnv allow .
direnv: reloading
direnv: loading .envrc
direnv export: +FOO
$ echo $FOO-nope
foo
$ cd ..
direnv: unloading
direnv export: ~PATH
$ echo $FOO-nope
nope
direnv might be what you are looking for.
Here is an example taken from the official documentation:
$ cd ~/my_project
$ echo $FOO-nope
nope
$ echo export FOO=foo > .envrc
.envrc is not allowed
$ direnv allow .
direnv: reloading
direnv: loading .envrc
direnv export: +FOO
$ echo $FOO-nope
foo
$ cd ..
direnv: unloading
direnv export: ~PATH
$ echo $FOO-nope
nope
answered Jul 31 at 7:15
navigaid
10111
10111
add a comment |Â
add a comment |Â
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f21363%2fexecute-bash-scripts-on-entering-a-directory%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
2
Into every directory, or selected ones? And the same script for each, or not?
â enzotib
Sep 24 '11 at 19:50
Every directory. The script in the directory named projectSettings.bash if it exists.
â Prospero
Sep 24 '11 at 19:54
Similar question on Stack Overflow
â Gilles
Feb 26 '15 at 23:41