bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: I have a bash style question. Feedback request.


From: dethrophes
Subject: Re: I have a bash style question. Feedback request.
Date: Fri, 20 Apr 2012 17:13:30 +0200
User-agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20120327 Thunderbird/11.0.1

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
)







reply via email to

[Prev in Thread] Current Thread [Next in Thread]