From owner-freebsd-questions@FreeBSD.ORG Sat Mar 19 16:15:58 2011 Return-Path: Delivered-To: freebsd-questions@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 545791065695 for ; Sat, 19 Mar 2011 16:15:58 +0000 (UTC) (envelope-from max@mxcrypt.com) Received: from mail-vx0-f182.google.com (mail-vx0-f182.google.com [209.85.220.182]) by mx1.freebsd.org (Postfix) with ESMTP id 197CB8FC17 for ; Sat, 19 Mar 2011 16:15:57 +0000 (UTC) Received: by vxc34 with SMTP id 34so4918956vxc.13 for ; Sat, 19 Mar 2011 09:15:57 -0700 (PDT) Received: by 10.52.159.3 with SMTP id wy3mr3172840vdb.289.1300551356179; Sat, 19 Mar 2011 09:15:56 -0700 (PDT) MIME-Version: 1.0 Received: by 10.220.159.19 with HTTP; Sat, 19 Mar 2011 09:15:26 -0700 (PDT) In-Reply-To: References: <759A467E-407A-4DB8-9756-08011B5405F0@vicor.com> From: Maxim Khitrov Date: Sat, 19 Mar 2011 12:15:26 -0400 Message-ID: To: 839273@gmail.com Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Cc: Devin Teske , Andres Perera , FreeBSD Subject: Re: Shell script termination with exit function in backquotes X-BeenThere: freebsd-questions@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: User questions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 19 Mar 2011 16:15:58 -0000 On Mon, Mar 14, 2011 at 6:40 PM, Andres Perera wrote: > On Mon, Mar 14, 2011 at 7:46 AM, Maxim Khitrov wrote: >> On Mon, Mar 14, 2011 at 3:16 AM, Andres Perera wrote= : >>> On Sun, Mar 13, 2011 at 9:49 PM, Devin Teske wrote: >>>> If you make the changes that I've suggested, you'll have consistent ex= ecution. The reason you're having inconsistent behavior is because Linux ha= s /bin/sh symbolically linked to /bin/bash while FreeBSD has a more traditi= onal shell (we'll call it bourne shell "plus"). >>> >>> that is misleading because command substitutions have traditionally >>> invoked subshells, and freebsd sh(1)/ash is an exception, not the norm >>> >>> in this case, ksh and bash deviates are clearly closer to standard >>> bourne behaviour >>> >> >> Thanks for that explanation. I can understand the benefits of >> optimizing away subshell execution, but that can clearly lead to >> unexpected behavior. Is there some documentation on when this >> optimization is utilized (i.e. the command executed without a >> subshell)? Would I be correct in assuming that it is only restricted >> to built-in commands that are known not to produce any output, such as >> 'exit'? > > i would check the source, autoconf docs, and http://www.in-ulm.de/~masche= ck/ > > netbsd has =C2=A0been patched to fix `exit 1`, according to the last site Here's another, but related, problem that I just ran into. The man page rea= ds: Commands may be grouped by writing either (list) or { list; } The first form executes the commands in a subshell. Note that built-i= n commands thus executed do not affect the current shell... Here's my script: ---- #!/bin/sh { A=3D1; }; echo $A echo | { B=3D2; }; echo $B { C=3D3; } > /dev/null; echo $C ---- And here's the output: ---- 1 3 ---- Where did the '2' go? Again, I have to assume that when stdin is piped to a group of commands, those commands are executed in a subshell despite curly braces. But where is this behavior documented? It seems that there are a lot of corner cases that can only be understood if you are familiar with the shell implementation. Documentation can certainly be improved in places. - Max