#!/bin/sh
$*
that's my `~/bin/noglob` file, so when I call a zsh script from bash that uses `noglob`, it doesn't blow up. $ echo foo | tr fo FO | sed 's/FOO/BAR/'
BAR
$ echo foo | ${IFS# tr fo FO | } sed 's/FOO/BAR/'
foo
It's nice to have a way to both /* ... */ and // ...
in shell scripts though: foo \
| bar ${IFS Do the bar. Do it. } \
| baz
* in the best possible way, like it's awful - I hate I didn't think of that foo |
bar |
baz
You don't have to use backquotes, AND, it allows you to comment line by line, because there's no backslash messing with the parser.I also use a last `|\ncat` so you can delete any line and you don't have to worry about the last line being a bit different than the rest
I created a list of similar tricks in https://github.com/kidd/scripting-field-guide in case anyone wants to take a look
$ {
> echo foo \
> && echo bar \
> || echo baz ;
> }
foo
bar
<^P><^A>$<^F>IFS
${IFS# echo foo && echo bar || echo baz ; }
$ _
There's good and bad to both approaches. I like how I can use () and {} to bracket things and otherwise every line that end in \ is continued. I line-up on the left with the operator, you with indentation. When you use a # style comment, you have to look up and back and forward to see what the operator is you are continuing over to the next line: $ foo |
bar | # ?Do? *the* $bar$ && [do] {it!}
baz
Which only takes an extra neuron or so, but then history... <^P>
$ foo | bar | # ?Do? *the* $bar$ && [do] {it!}
bazUsing brackets like this is something I never thought of, and it's probably why it's hard for me to process it, but I can see it provides nice annotation capabilities, and it's a more self-contained style.
Thx for sharing!
mycmd1 #| mycmd2
This will output the stdout of mycmd1:
mycmd1 #| mycmd2 | mycmd3
This will output the stdout of mycmd3: mycmd1 | \# mycmd2 | mycmd3I've somehow gotten by never really needing to pipe any commands in the terminal, probably because I mostly do frontend dev and use the term for starting the server and running prodaccess
Now let's say the output looks wrong; e.g. we get nothing out. Weird, the previous command looked right, and it doesn't seem to be a problem with the filter we just put on the end. Maybe the filter we added part-way-through was discarding too much, so that the things we actually wanted weren't reaching the later stages; we didn't notice, because everything was being drowned-out by irrelevant stuff that that our latest filter has just gotten rid of.
Tricks like this `\#` let us turn off that earlier filter, without affecting anything else, so we can see if it was causing the problem as we suspect.
As for more general "why use CLI?", that's been debated for decades already; if you care to look it up :-)