pgindent vs dash

For those who don't know, pgindent is the tool used to indent the source code of PostgreSQL. dash is the shell that ships as /bin/sh on at least Ubuntu.

pgindent requires indent from BSD (we use a patched version from NetBSD, the source is available on the PostgreSQL ftp site), and specifically does not work with GNU indent. Guess what Ubuntu ships with.

The solution is of course a small script that runs BSD indent from a different directory, and also points out the typedefs.list file from the PostgreSQL git repo. Something like this:

#!/bin/sh

export PATH=src/tools/pgindent:$PATH
src/tools/pgindent/pgindent src/tools/pgindent/typedefs.list $*

Spot the error? Yeah, that calls /bin/sh, which is dash. Which gives some really interesting results with pgindent, none of which are what you expect.

So if you run pgindent through a script like this, be sure to use /bin/bash and not /bin/sh!


Comments

Interesting post, thank you.

As for the sh problem, the following shebang line should work:

!/usr/bin/env bash

Posted on Jan 18, 2011 at 17:03 by Hannes Just.

Oh, just using

!/bin/bash

works fine. It's /bin/sh that doesn't (and AFAIK it does work if /bin/sh is actually sh and not dash)

Posted on Jan 18, 2011 at 17:05 by Magnus.

Not every distribution will install bash in /bin. Some will install bash only in /usr/bin/bash, so hard-coding its path will fail on those systems.

Debian and Ubuntu are using the light-weight dash to speed up their boot process. It's not fully compatible with bash. It's not a requirement for distributions that /bin/sh actually is bash. Basically, /bin/sh just has to be smart enough to run init.d scripts. Therefore, if you depend on certain bash functionality (those fancy expansion features come to my mind), request bash instead of sh through the shebang.

Posted on Jan 18, 2011 at 17:27 by Hannes Just.

Add comment

New comments can no longer be posted on this entry.

Conferences

I speak at and organize conferences around Open Source in general and PostgreSQL in particular.

Upcoming

SCaLE 2023
Mar 9-12, 2023
Pasadena, CA, USA
Nordic PGDay 2023
Mar 21, 2023
Stockholm, Sweden
pgday.Paris 2023
Mar 23, 2023
Paris, France
PGCon 2023
May 30-Jun 2, 2023
Ottawa, Canada
PGConf.EU 2023
Dec 12-15, 2023
Prague, Czechia

Past

FOSDEM 2023
Feb 2-5, 2023
Brussels, Belgium
PGConf.EU 2022
Oct 25-28, 2022
Berlin, Germany
PGConf.NYC 2022
Sep 22-23, 2022
New York, USA
Swiss PGDay 2022
Jul 1, 2022
Rapperswil, Switzerland
pgCon 2022
May 24-27, 2022
Online, Online
More past conferences