<div dir="ltr"><div>Digressing a bit (but only a bit) talking about IPC: Powershell and CMS PIPELINES both take the approach of more structured pipelines, where pipe contents are not just streams of bytes but can be structured records.  This offers a lot of power, but it also inhibits the ability to arbitrarily compose pipe stages, because you've effectively introduced a type system.</div><div><br></div><div>On the other hand you can certainly argue that stream-of-bytes pipes ALSO introduce a type system, it's just a completely ad-hoc, undocumented, and fragile one that relies on the cooperation of both ends of the pipe to work at all, and you'd be right.</div><div><br></div><div>In practice...well, I'd rather use stream-of-bytes, but I am more comfortable in Unix-like environments than Powershell, and my CMS PIPELINES skills are quite rusty now.<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Jul 31, 2021 at 7:21 AM Adam Thornton <<a href="mailto:athornton@gmail.com">athornton@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="auto" style="overflow-wrap: break-word;"><br><div style="direction:ltr"><br><blockquote type="cite"><div>On Jul 31, 2021, at 5:25 AM, Michael Siegel <<a href="mailto:msi@malbolge.net" target="_blank">msi@malbolge.net</a>> wrote:</div><div><div><br>While doing that, I learned that there is a better way to approach<br>this problem – beyond using getopt(s) (which never really made sense to<br>me) and having to write case statements in loops every time: Define a<br>grammar, let a pre-built parser do the work, and have the parser<br>provide the results to the program.<br></div></div></blockquote></div><br><div>I see that Dan Halbert beat me to mentioning "click."<br></div><div><br></div><div>The trick with shell is that unless you write the parser in shell, which is going to be miserable, you’re doing it in a command in a subshell, and therefore your return values have to be a structured stream of bytes on stdout, which the parent shell is going to have to interpret.  An eval-able shell fragment, where you have a convention of what the variables you get from the option parser will be, is probably the easiest way, since from the parent that would look like:</div><div><br></div><div>$(parse_my_opts $*)</div><div># Magic variables spring to life</div><div>if [ “$OPT_SUBCOMMAND_0” == “burninate” ]; then ….</div><div><br></div><div>Adam</div></div></div>
</blockquote></div>