An appreciation for the Posix $( ) command substitution syntax

January 6, 2011

The Posix standards for Unix sometimes get a bad rap (there are some crazy things in there, and some not so great ones), especially for the bits that they invented, but every so often I think that they did something absolutely right. The new Posix $(...) syntax for command substitution is one shining example of this; it is superior to the original Bourne shell syntax of `...` in so many ways. Here's some of the reasons that I like it.

First off, $(...) nests in a straightforward way without needing special quoting. All by itself this is a huge advantage; I've written before that any time you have multiple levels of quoting and processing going on, things go to hell. Nested $(...)'s let you avoid all of that; you don't need to quote anything, you just nest them and then read them outside in (or inside out). You can easily extract an inner $(...) to run it standalone to make sure that it returns the right result, and so on.

Next, $(...) is (in my opinion) easier to read and scan, because the edges of the command substitution are much easier to spot. ( and ) are much more visually distinctive than `, and run very little risk of being confused with other characters (unlike ` with ' and "). It's also clear whether you're dealing with the start or the end of a command substitution, unlike the Bourne shell case where a stray ` might be doing either and you need to carefully watch the surrounding context.

Finally, it's easier to see and remember that $(...) will expand inside "..."-quoted strings, because it looks just like other $ expansions. With traditional Bourne shell you had to remember that both $ and `...` expanded in that context.

(This cuts both ways when writing shell scripts; I find that I'm much more likely to use $() inside double quotes than I ever was with `...`, simply because it's easier to remember that it's possible.)

PS: before I started writing this entry, I had the incorrect impression that $(...) originated in bash. Bash is probably still the most common Bourne shell variant to find it supported (and I see that Solaris sh doesn't support it, not that this surprises me any more), but there are a number of others such as dash and various versions of Kenneth Almquist's sh implementation (originally called ash).


Comments on this page:

From 84.203.137.218 at 2011-01-06 07:15:59:

Yep $() rocks, as does the other POSIX syntax $((0xDEAD+0xBEEF))
Note for both not to be highlighted as errors when writing shell in vim, one needs to do the following in your .vimrc

let g:is_posix = 1

I asked for this to be the default mode, but was rejected because they think it better to be compatible for the 3 remaining original bourne shell users

From 72.95.128.197 at 2011-01-08 18:29:04:

Solaris /bin/sh is Bourne shell, not POSIX shell. You want /usr/xpg4/bin/sh, which is really ksh. Alas, nothing in POSIX mandates that /bin/sh be the shell which the standard refers to.

Written on 06 January 2011.
« An actual use for the CSS overflow property
More modest suggestions for bug trackers »

Page tools: View Source, View Normal, Add Comment.
Search:
Login: Password:
Atom Syndication: Recent Comments.

Last modified: Thu Jan 6 00:24:16 2011
This dinky wiki is brought to you by the Insane Hackers Guild, Python sub-branch.