<div dir="auto">Thank you very much, Nick, Michael, and all! The last meeting was very informative and fun. Nick, this follow up is also fantastic!</div><br><div class="gmail_quote"><div dir="ltr">On Wed, Aug 22, 2018, 22:53 Nick Holland <<a href="mailto:nick@holland-consulting.net">nick@holland-consulting.net</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">As I mentioned after Michael's presentation on "ed" yesterday, when<br>
moving my shell scripting tips presentation from whatever it started on<br>
to whatever I finished using, I missed a slide.<br>
<br>
Often forgot when scripting are "here documents" -- done by doing<br>
something like this:<br>
<br>
program <<__EOT<br>
input for program 1<br>
input for program 2<br>
input for program 3<br>
__EOT<br>
<br>
where the three lines between <<__EOT and __EOT are fed to "program".<br>
"__EOT" can be any unique string that isn't in the body of the text<br>
being fed to the program...double leading underscores are common, but<br>
not at all required.<br>
<br>
Lots of people know about this...though I know I often forgot about them<br>
until I started putting together my shell scripting tips presentation.<br>
<br>
The problem is, in a neatly formatted script, here documents are often<br>
ugly -- crammed against the left margin, even though the "program" may<br>
be indented...so your here document might look like this:<br>
<br>
while bla; do<br>
    program <<__EOT<br>
input for program<br>
input for program<br>
input for program<br>
__EOT<br>
    done<br>
bla bla<br>
<br>
Well, turns out as is often the case, Unix coders long ago noticed the<br>
same problems we thought we discovered, and fixed it long ago.  It turns<br>
out if you change the << to <<- the shell will strip off leading tabs<br>
(and ONLY tabs), so your script can now look more like this:<br>
<br>
while bla; do<br>
    program <<-__EOT<br>
        input for program<br>
        input for program<br>
        input for program<br>
        __EOT<br>
    done<br>
bla bla<br>
<br>
Now note, both the "here document" text and the end marker are all<br>
indented with a tab.  Now, the tabs are all stripped, so you can have<br>
multiple (or inconsistent) tabs if needed/desired.<br>
<br>
<br>
And ... here's a script I used today, slightly sanitized, I ran today.<br>
A few weeks ago, I updated the /etc/hosts file on all our customers<br>
systems to fix a long standing and painful set of problems, purging a<br>
lot of junk and replacing it with consistent data, while not messing<br>
with the system specific data.  And about two days after completing this<br>
pain in the *** task, I found out I forgot one entry...times 90 systems.<br>
<br>
So ... a simple ed script to see if the machine needs the update, if so<br>
find where I wanted the new line to be inserted, open up a new line, add<br>
the new text, exit insert mode, write it, quit.  Move on to the next.<br>
<br>
#!/usr/bin/ksh<br>
<br>
for H in `/opt/bin/progthatlistssystems`; do<br>
    echo === $H ===<br>
    if ! ssh $H "host <a href="http://img-gf.example.org" rel="noreferrer noreferrer" target="_blank">img-gf.example.org</a> >/dev/null 2>&1"; then<br>
        echo "must fix $H"<br>
        ssh -t $H "ed /etc/hosts" <<-__ENDED<br>
                /<a href="http://img-sf.example.org/" rel="noreferrer noreferrer" target="_blank">img-sf.example.org/</a><br>
                a<br>
                10.3.217.20     <a href="http://img-gf.example.org" rel="noreferrer noreferrer" target="_blank">img-gf.example.org</a>        img-gf<br>
                .<br>
                w<br>
                q<br>
                __ENDED<br>
    fi<br>
    sleep 1<br>
done<br>
<br>
Note that I tend to use a 4 space indent.  By the time we got to the ed<br>
input, we should have been at 12 chars, so there's a TWO tab leading indent.<br>
<br>
And while I have blundered my way through ed before, I wrote that<br>
completely from memory from Michael's talk, no man page or book used. :)<br>
<br>
Nick.<br>
<br>
_______________________________________________<br>
Semibug mailing list<br>
<a href="mailto:Semibug@lists.nycbug.org" target="_blank" rel="noreferrer">Semibug@lists.nycbug.org</a><br>
<a href="http://lists.nycbug.org/mailman/listinfo/semibug" rel="noreferrer noreferrer" target="_blank">http://lists.nycbug.org/mailman/listinfo/semibug</a><br>
</blockquote></div>