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 :-)