From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tim Cross Subject: Re: Bug or not a bug? dot expansion in ob-shell Date: Sun, 01 Mar 2020 14:50:06 +1100 Message-ID: <87sgiszqc1.fsf@gmail.com> References: <87eeur3p1p.fsf@ucl.ac.uk> <87a75eap8k.fsf@gnu.org> <87y2sy3kkl.fsf@ucl.ac.uk> <87r1yq4xiz.fsf@gnu.org> <875zg2kcy0.fsf@ucl.ac.uk> <87h7zmiw0v.fsf@gmail.com> <871rqqag19.fsf@bzg.fr> <87wo8iitzz.fsf@ucl.ac.uk> <87ftf63d79.fsf@gnu.org> <87pnear7tl.fsf@ucl.ac.uk> <87v9o236v1.fsf@gnu.org> <8736b66z6t.fsf@gnu.org> <877e0h571l.fsf@alphaville.usersys.redhat.com> <878skwbc3g.fsf@bzg.fr> <8736b36492.fsf@alphaville.usersys.redhat.com> <87imjyoi99.fsf@gnu.org> <87y2slqudr.fsf@gmail.com> <87y2sltnas.fsf@gmail.com> Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from eggs.gnu.org ([2001:470:142:3::10]:56332) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1j8FcL-0003iq-TI for emacs-orgmode@gnu.org; Sat, 29 Feb 2020 22:50:15 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1j8FcK-00089M-D2 for emacs-orgmode@gnu.org; Sat, 29 Feb 2020 22:50:13 -0500 Received: from mail-pg1-x542.google.com ([2607:f8b0:4864:20::542]:46454) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1j8FcK-000895-6c for emacs-orgmode@gnu.org; Sat, 29 Feb 2020 22:50:12 -0500 Received: by mail-pg1-x542.google.com with SMTP id y30so3613657pga.13 for ; Sat, 29 Feb 2020 19:50:11 -0800 (PST) Received: from tim-desktop (203-173-18-87.dyn.iinet.net.au. [203.173.18.87]) by smtp.gmail.com with ESMTPSA id m12sm7317326pjf.25.2020.02.29.19.50.08 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 29 Feb 2020 19:50:09 -0800 (PST) In-reply-to: List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane-mx.org@gnu.org Sender: "Emacs-orgmode" To: emacs-orgmode@gnu.org It seems to me that two separate issues have been mixed up and causing some confusion here. However, I think it is actually quite simple once we consider the issues separately. Issue 1: Defining the meaning of :result value and :result output Issue 2: Specifying what the default :result setting would be i.e. :result without a value/output specifier. Issue 1 seems the most straight-forward to me - output :: Whatever goes to stdout/stderr - value :: whatever would be returned by the execution of the code. This might be a return value (i.e. for some shell commands) or the value returned by a function (including shell functions i.e. bash function) or the last command executed etc. Essentially, anything returned (including nil) by the block. STDOUT/STDERR is never a return value (though some languages may send output to STDOUT/STDERR as well as returning it, in which case it would also be in :return value). Note that I don't agree that the only 'useful' result from shell blocks is output. You might have a complex shell script which uses source blocks to define shell functions that return values which you use via oweb expansion to include in other blocks etc.s With this definition, essentially :result value is essentially anything except whatever is sent to stdout/stderr. Issue 2 is a little more difficult. It is likely that a 'standard' default for :result that is the same for all languages is not possible/desired. The default will likely be a combination of what seems most natural for that language and what is most common usage for the majority of users. It could be that for some languages, the default for :result should be :result output and for others it should be :result value. Personally, I care less about issue 2 than issue 1. In the worst case, I will need to change my header arguments for some blocks and that would be easily automated. Far more critical is that :result value and :result output are clear, unambiguous and consistent. Any proposal to change these meanings because of different uses cases in languages is a bad idea. Instead, changing the 'default' would be preferable. Having shell source blocks return STDOUT/STDERR output for :result value is IMO a bad idea. Having shell blocks default to :result output when only specifying :result while having other languages, like python or clojure default to :result value seems far more preferable (provided differences are clearly documented of course). The current situation seems inconsistent to me e.g. #+begin_src shell :results value echo . #+end_src #+RESULTS: : . #+begin_src shell :results output echo . #+end_src #+RESULTS: : . You get the same results value regardless of whether :results value or :results output. I think :results value should return 0 (return code for echo). Whether shell blocks defaults to :results output or :results value is a different questions (it probably should default to :result output). e.g. #+begin_src shell echo . #+end_src #+RESULTS: : . #+begin_src shell :results value echo . #+end_src #+RESULTS: : 0 #+begin_src shell :results output echo . #+end_src #+RESULTS: : . Tom Gillespie writes: > Hi all, > Sorry to be late to this thread (and for a wall of text), but as a > heavy user of ob-shell I wanted to chime in. First a disclosure, I > would be very unhappy if option 1 were selected, it would require me > to make a whole bunch of changes and try to find an option to revert > to the current default behavior. When I run a bash block in org mode, > I want what is going to stdout, why else would I run it in org? If I > don't want to capture the output then it is either in a pipeline > inside the block, or I will silence the results. Option two is by far > the most reasonable answer in my opinion and there is a consistent > principle which can be applied in many cases so that it would not be > an exception. The principle is that block defaults for results should > default to the value that the language itself makes the most > accessible. Shell return codes are esoteric from this point of view, I > had been writing bash scripts for years before I learned about $?. By > far the most actionable and accessible thing to a user of a shell > program is the stdout -- ignore the naming for a moment, because the > meaning is not in the name, it is in how it interacts with other > programs in the larger environment. If we apply the logic that says > that option 1 should be the default, then python blocks set to results > value should return nothing unless an error is raised and then they > should return the error. This is clearly absurd, no python programmer > cares about the absence of an error and making the default behavior of > python blocks verbosely report their non-errorness by default would > likely incite a riot. What has happened with shells is that the > nomenclature has been switched with respect to how users and other > code consume and deal with 'outputs' aka return values in any other > langues, shell return values are error signals and should be treated > as such, unfortunately (or perhaps fortunately?) org-mode doesn't have > an error handling/signaling system, but if a python code block fails > emacs will yell at us, shells don't do this, it is up to the user to > detect and handle the error case themselves, but that is a language > internal matter. In summary, option 2 seems to me to be the most > consistent with how users interact with shell commands and shell > scripts, return codes are more akin to error handling in other > languages, so ignoring the naming issues, if `my-org-block` behave > like a shell function, then pipe would be the more appropriate default > behavior than `$?`. I think that the underlying principle can be > applied to other languages as well to arrive at sane defaults. > Thoughts? > Tom > > > On Sat, Feb 29, 2020 at 7:41 AM Jack Kamm wrote: >> >> Sorry, I was confused about this: >> >> > According to my reading of this thread, most of the commenters were in >> > agreement that we should keep the original behavior and return the exit >> > code, as we do in 9.3. >> >> Actually, it looks like ":results value" does return the exit code. I >> just got confused because shell blocks now return the output when no >> ":results" is specified. >> -- Tim Cross