On Tue, Feb 23, 2021 at 03:11:18AM -0500, Scott Colby wrote: > Hello, > > I am having some difficulty translating the following shell script > to execline: > > #!/usr/bin/env sh > file_loc=$(xmlstarlet sel -t -v '//File/Path' /etc/some-config.xml 2>&1) > # if //File/Path is missing from some-config.xml, > # xmlstarlet will have exited non-zero and we skip this > if test $? -eq 0 > then > if ! test -e "$file_loc" > then > create-file > fi > fi > exec /usr/bin/s6-svscan /service > > Here's what I have so far: > > #!/usr/lib/execline/bin/execlineb -P > foreground { > if -n { > backtick -i file_loc { > fdmove -c 2 1 xmlstarlet sel -t -v //File/Path /etc/some-config.xml > } > importas -iu file_loc file_loc test -e $file_loc > } > create-file > } > /usr/bin/s6-svscan /service > > The problem is, `if -n` can't differentiate between the failure of > xmlstarlet within backtick and the failure of `test -e`. I only > want create-file to be called if xmlstarlet succeeds and `test -e` > fails. I've tried various permutations of wrapping backtick and > importas with other if constructs, but couldn't find one that worked. > Looking at the other conditional commands, maybe I could take > advantage of ifthenelse setting $? before continuing the exec chain, > but I'm wondering if there is a better way. > > How can I make such a script using execline? > > Thank you, > Scott >
Hi! If i understood correctly, this should do what you want: #!/usr/lib/execline/bin/execlineb -P foreground { backtick -i file_loc { fdmove -c 2 1 xmlstarlet sel -t -v //File/Path /etc/some-config.xml } importas -iu file_loc file_loc if -n { test -e $file_loc } create-file } /usr/bin/s6-svscan /service Move the backtick out of the if, if xmlstartlet fails backtick (-i) will not execute the if (and importas) at all.