Vadym Chepkov wrote:
> I found out a very unusual feature of bash which makes it to act
> really unexpected. I understand that pipelines are executed in a
> separate subshell, but I really think 'exit' command should be
> absolute. Consider a trivial code:

Note that dash also behaves this way too.

> #!/bin/bash
> 
> echo Start
> ps -ef | while read proc
> do
>  echo $proc
>  exit 1
> done
> echo Continue
> 
> I would expect never see "Continue" printed, I didn't put any
> conditional checks to simplify the example, but I really expect the
> script to be completely aborted when it gets to 'exit', not having
> to add additional checks or replace pipeline with temporary files

This is a variation on Bash FAQ E4.  Pipes create subshells.

You can avoid this by avoiding piping to the while loop.  Instead use
a redirection and no subshell will be created.

  #!/bin/bash
  echo Start
  while read proc
  do
   echo $proc
   exit 1
  done < <(ps -ef)
  echo Continue

The "<(command)" syntax is documented in the Process Substitution
section of the manual.

Bob


Reply via email to