You may be interested in my version<https://github.com/jfredett/scripts/blob/master/utilities/dirstack.sh>[1] of a directory stack module. It alters the API a bit from pushd and popd (I think for the better). And makes use of the subshell techique mentioned by dethrophes.
[1]https://github.com/jfredett/scripts/blob/master/utilities/dirstack.sh On Fri, Apr 20, 2012 at 11:13 AM, dethrophes <dethrop...@web.de> wrote: > Am 20.04.2012 16:38, schrieb Steven W. Orr: > > I manage a hefty collection of bash scripts. Sometimes, I make heavy use >> of pushd and popd. When problems come up, the directory stack can make >> debugging more complicated than I'd like. One thing I did to get better >> control over things was to write a dstack module that provides pushd and >> popd functions. >> >> The dstack module gives me simple flags that I can set through an >> environment variable that allow me to dump the stack either before or after >> a pushd or a popd, and to control their stdout and stderr. The default is >> that they both redirect to /dev/null and that all calls are checked when >> they return. e.g. >> push somewhere || die 'Failed to pushd to somewhere' >> >> (I hope people are still reading...) >> >> Recently I discovered context managers in python and I had already >> implemented a directory stack module there. I added a context manager so >> that instead of saying >> >> ds.pushd(foo) >> do_a_bunch_of_stuff >> ds.popd() >> >> I can now say >> >> with ds(foo): >> do_a_bunch_of_stuff >> # The popd is now automatic. >> >> Back to bash, I see that things like code readability are impacted by the >> frequent use of pushd / popd. There could be lots (more than a screen full) >> between the pair, and forgetting to put the popd in or losing track of >> where you are can make things more complicateder. So, I thought: How can I >> get the benefit of a context manager in bash? It came to mind that simple >> curly braces might help. >> >> So now I'm thinking of two possible scenarios. >> >> Here's S1: >> >> pushd somewhere >> { >> do_a_bunch_of_stuff >> } >> popd >> >> And S2 would be: >> >> { >> pushd somewhere >> do_a_bunch_of_stuff >> popd >> } >> >> I'd like to get feedback. Some choices for reasonable feedback might be: >> a. It doesn't matter and I'm clearly overthinking this. Just pick one. >> b. I like S[12] and anyone who disagrees will be met with a jihad. >> c. Here's a better solution that I didn't think of. >> >> If you got this far, have feedback and are in the Boston area, there's a >> beer with your name on it. >> >> TIA :-) >> >> Tried something like this? > > > function RunCmdDir { > pushd "${1}" || return $? > "${@:2}" > popd > } > RunCmdDir "Work/Dir" do_a_bunch_of_stuff > > ok so you'd have to put the in between code in a function(if you want more > than 1 instruction) but that would probably help code readability anyway. > > > you could use a sub shell, if do_a_bunch_of_stuff doesn't need to modify > the global context. > ( > cd "Path" > do_a_bunch_of_stuff > ) > > > > > >