Process substitution into loop

Grail Dane grail69 at hotmail.com
Tue Jun 14 03:49:22 UTC 2011


Well, I can confirm that setting the interpreter to /bin/sh does not support process substitution as I have run the following scriptunder both:
while read -r DEVICEdo    echo ip link set dev $DEVICE updone< <(ip link | awk '/^[0-9]/ && gsub(/:/,""){print $2}')
Under bash I get:
ip link set dev lo upip link set dev eth0 upip link set dev sit0 up
Under sh I get:
line 6: syntax error near unexpected token `<'line 6: `done< <(ip link | awk '/^[0-9]/ && gsub(/:/,""){print $2}')'
I also have not been able to find a way to successfully implement the Cookbook option to change the default shell.To this end I mean that if I add the CFLAGS option prior to compiling, the output once running:
start network-interfaces
Yields the same type of error as the script above:
/proc/self/fd/10: line 6: syntax error near unexpected token `<'init: network-interfaces main process (27800) terminated with status 2start: Job failed to start
I can confirm that the here document idea does work so I am left with the fact that the CFLAGS optionwas some how no interpreted :(
Once compiled and installed is there any way to check what shell it thinks is the default?
Cheersgrail
Date: Mon, 13 Jun 2011 18:15:20 -0700
Subject: Re: FW: Process substitution into loop
From: scott at netsplit.com
To: grail69 at hotmail.com
CC: upstart-devel at lists.ubuntu.com

Note the phrase startup behaviour in the paragraph - bash still supports bashisms in its scripts when invoked as sh (after all, that's where the entire historical problem with them comes from)


On Mon, Jun 13, 2011 at 4:56 PM, Grail Dane <grail69 at hotmail.com> wrote:






Hi James
Thanks very much for the reply.  As you can probably guess the typo is in the email but not in
the actual script.  I did further testing and as per the bash install instructions:


sh
A symlink to the bash program; when invoked as sh, bash tries to mimic the startup behavior of historical versions of sh as closely as possible, while conforming to the POSIX standard as well


This would indicate that it is a bash builtin feature to use only POSIX compliant options.
So from the Cookbook you may need to edit the following from the section you pointed me to:

If you wish to change this, you can either make /bin/sh a symbolic link to your chosen shell

As this does not work as expected in this case and it may be similar for other shells to.

I will try the workaround of adding it as the default shell in the build and let you know how it goes :)


Cheersgrail
> Date: Fri, 10 Jun 2011 11:22:12 +0100

> From: james.hunt at ubuntu.com
> To: grail69 at hotmail.com

> CC: upstart-devel at lists.ubuntu.com
> Subject: Re: Process substitution into loop

> 
> Hi Grail,
> 
> On 10/06/11 05:46, Grail Dane wrote:

> > 
> > 
> >> Date: Thu, 9 Jun 2011 21:05:45 -0700
> >> From: steve.langasek at ubuntu.com

> >> To: grail69 at hotmail.com
> >> CC: upstart-devel at lists.ubuntu.com

> >> Subject: Re: Process substitution into loop
> >>
> >> On Fri, Jun 10, 2011 at 03:53:15AM +0000, Grail Dane wrote:

> >> > Just wondering, as I can't find by googling, if it is at all possible to
> >> > do a processsubstitution into a while loop within an upstart script?

> >>
> >> > Example:
> >> > while read -r DEVICE
> >> > do

> >> > ip link set dev $DEVICE up
> >> > done< <(ip link | awk '/^[0-9]/ && !/UP/ && gsub(/:/,""){print $2})

> You have an error in your script: it is missing the closing tick (see below).
> 
> >>
> >> > When issuing the start command on the script I get:

> >> > /proc/self/fd/10: line 6: syntax error near unexpected '<'init:
> >> > network-interfaces main process (1367) terminated with status 2start: Job

> >> > failed to start Would appreciated if someone would identify if i have done
> >> > something wrong or if this not a supported feature?

> >>
> >> The <() syntax is not part of the POSIX standard, it's a bash extension.
> >> Upstart uses /bin/sh to interpret scripts, as is customary; chances are

> >> you're running on a system where /bin/sh is not bash, and as a result this
> > 
> > Actually /bin/sh is a symbolic link to bash on my system.  Is there anyway to have bash as the

> > shell used?
> 
> script
> /bin/bash <<EOT

> while read -r DEVICE
> do
>     echo "DEBUG: ip link set dev $DEVICE up" > /tmp/grail.log

> done < <(ip link | awk '/^[0-9]/ && !/UP/ && gsub(/:/,""){print $2}')
> EOT
> end script

> 
> Also, just for you :)...
> 
> http://upstart.ubuntu.com/cookbook/#changing-the-default-shell

> 
> Regards,
> 
> James.
> 

> > 
> >> syntax is not supported.
> >>
> >> A supported syntax would be:

> >>
> >> ip link | awk '/^[0-9]/ && !/UP/ && gsub(/:/,""){print $2}' |
> >> while read -r DEVICE

> >> do
> >> ip link set dev $DEVICE up
> >> done
> >>

> >> --
> >> Steve Langasek Give me a lever long enough and a Free OS
> >> Debian Developer to set it on, and I can move the world.

> >> Ubuntu Developer http://www.debian.org/
> >> slangasek at ubuntu.com vorlon at debian.org

> > 
> 
 		 	   		  

--

upstart-devel mailing list

upstart-devel at lists.ubuntu.com

Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/upstart-devel



 		 	   		  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.ubuntu.com/archives/upstart-devel/attachments/20110614/1eb16b4e/attachment-0001.html>


More information about the upstart-devel mailing list