

Bash Scripting: Why didn't I start this earlier? - bkanber
http://burakkanber.com/blog/bash-scripting-why-didnt-i-start-this-earlier/

======
adrianN
I use Python for my scripting needs. It is a little bit more cumbersome to
call unix tools from a Python script, but handling strings and arguments and
things like that is so much easier. I feel like bash is really weird for
anything longer than a for loop.

Can someone please provide some arguments why I should write bash scripts
instead of Python scripts?

~~~
e12e
Personally I use bash when I need to, well, script shell commands. Anything
that is reasonably described as series of shell commands, filter/pipes.

There are a lot of best-practices that one need to adapt though, and there's
definitively a learning-curve. Generally scripts should work under things like
dash, and not be bash-specific. That means delegating some work to
sed/grep/awk (or being really "clever").

I've found that using functions, and passing arguments rather than setting
(global) variables help a lot -- and if you get to the point that you _really_
want do debug, you're better off rewriting in something like python.

I've never liked perl -- it's always seemed like a bit of a pointless exercise
in moving side-ways rather than "up". I've never had to move away from shell
scripts out of performance needs, only out of maintenance needs -- and for
_me_ perl buys me nothing in that direction.

Now, things like fabric[f] can make sense -- but the benefit of (ba)sh is that
it's guaranteed to be there (on a _nix platform) -- and it is great for
bootstrapping.

I'm _not* a fan of how some projects use (ba)sh, though. The ones that list
instructions like these (and there have been a few lately):

    
    
      curl http(s)://great-tool.com/install | sudo bash
    

They often a) don't use https and b) require sudo/root blindly (rather than at
least wrapping what needs sudo in something like:

    
    
          prompt -p "Need superuser permission for apt-yum-install libfoo [y/n]: " ans
          if [ "${ans}" == "y" ]; then
              sudo apt-yum-install libfoo
          else
             echo "Aborted."
             exit 1
          fi
    

Which generally works rather painlessly -- and could be further "automated" by
allowing a --yes-go-ahead, or checking if the script is running as root.

[f]: [http://fabfile.org](http://fabfile.org)

~~~
dfc
If you are worried about dash compatibility I hihly recommend checkbashisms:

[http://packages.debian.org/sid/devscripts](http://packages.debian.org/sid/devscripts)

------
vartosis
As a dual wielding hat person (sysadmin and programmer), stay away from bash
programming.

Use a modern scripting language like Python or Ruby otherwise you are entering
a world of pain.

[http://mywiki.wooledge.org/BashPitfalls](http://mywiki.wooledge.org/BashPitfalls)

~~~
nathan_long
Dependencies are another huge issue if you want to be cross-platform. A Ruby
script (for example) relies on the Ruby interpreter, which works the same
cross-platform. If it has other dependencies, there's an established way to
declare and install them.

In contrast, a bash program calls out to lots of little programs: sed, awk,
grep, etc. Different platforms have different implementations which take
different flags, etc.

My friend and I just spent a couple of days getting some bash scripts that ran
fine under Cygwin to also run on OSX. It was painful.

~~~
vinceguidry
Ruby system scripts assuredly do not work the same cross-platform,
particularly if they have to call to C libraries. Expect to have to rejigger
them just as you would bash.

------
retr0h
welcome to 2003

~~~
magnetikonline
Author makes that point in the very first paragraph.

~~~
bkanber
In the title, even!

------
AlexanderDhoore
Bash > All other languages. Bash is glue.

~~~
ollybee
you thinking of perl

