Forcing reading _only_ from standard input
Tuesday, 21 August 2018 · 5 messages · last reply 23 Aug 2018
RW
Richard Walker21 Aug 2018 03:12 #
Hi. I have a script in which I process data from
standard input like this:
VOCAB_WITH_NEW_VOCAB_NOTE="$(echo "$VOCAB" | "${BASEX}" -i - -q $"
copy \$c := . modify ...etc. etc.
The script has been working fine.
However, due to a defect in an earlier line in the script,
during one test run, the value of $VOCAB was (incorrectly)
an empty string.
But in this case, I got a quite unexpected result from
the above invocation of BaseX.
I can easily repeat the same phenomenon out of the script's context thus:
$ echo '' | basex -i - -q '.'
<vocabulary xmlns="http://vocabs.ands.org.au/registry/schema/2017/01/vocabulary" ...
etc. etc.In this case, rather than processing the empty string
provided as standard input, BaseX fetched data from one of my databases.
Can I/how do I force the option "-i -" to mean
"read data from standard input, and _only_ from standard input, even if that is empty"?
--
Richard Walker
Australian Research Data Commons (ARDC)
(formerly, Australian National Data Service, ANDS)
101 Liversidge Street
The Australian National University
Acton ACT 2601, Australia
E: Richard.Walker at ardc.edu.au
T: +61 2 6125 0584
W: ardc.edu.au
W: www.ands.org.au
CG
Christian Grün21 Aug 2018 19:44 #
Hi Richard,
Thanks for reporting this.
I didn’t manage to reproduce this behavior. Do you work with the latest version of BaseX? If yes, could you possibly download a fresh version (e.g. the zip distribution) and tell us step by step how I can simulate the behavior?
Thanks in advance, all the best,
Christian
Quoted text · Richard Walker · 46 lines
On Tue, Aug 21, 2018 at 3:12 AM Richard Walker <richard.walker at ardc.edu.au> wrote: > > Hi. I have a script in which I process data from > standard input like this: > > VOCAB_WITH_NEW_VOCAB_NOTE="$(echo "$VOCAB" | "${BASEX}" -i - -q $" > copy \$c := . modify ... > > etc. etc. > > The script has been working fine. > > However, due to a defect in an earlier line in the script, > during one test run, the value of $VOCAB was (incorrectly) > an empty string. > > But in this case, I got a quite unexpected result from > the above invocation of BaseX. > > I can easily repeat the same phenomenon out of the script's context > thus: > > $ echo '' | basex -i - -q '.' > <vocabulary xmlns="http://vocabs.ands.org.au/registry/schema/2017/01/vocabulary" ... > etc. etc. > > In this case, rather than processing the empty string > provided as standard input, BaseX fetched data from one of my databases. > > Can I/how do I force the option "-i -" to mean > "read data from standard input, and _only_ from standard input, > even if that is empty"? > > -- > Richard Walker > Australian Research Data Commons (ARDC) > (formerly, Australian National Data Service, ANDS) > 101 Liversidge Street > The Australian National University > Acton ACT 2601, Australia > E: Richard.Walker at ardc.edu.au > T: +61 2 6125 0584 > W: ardc.edu.au > W: www.ands.org.au >
RW
Richard Walker22 Aug 2018 03:43 #
Quoted text · Christian Grün · 3 lines
On 22 Aug 2018, at 3:44 am, Christian Grün <christian.gruen at gmail.com> wrote: > I didn’t manage to reproduce this behavior. Do you work with the > latest version of BaseX?
9.0.2.
Quoted text · Christian Grün · 3 lines
> If yes, could you possibly download a fresh > version (e.g. the zip distribution) and tell us step by step how I can > simulate the behavior?
Further clarification/correction to what I reported:
* When I said "empty string", in fact the "problem" arises
when standard input is _not_ empty, but includes just a
blank line.
* When standard input is empty, I get an exception
NoSuchElementException. That is probably acceptable:
at least, it is better than getting output that has
nothing to do with the input data.
* When I said "one of my databases", I think that _may_ have been wrong. It may be content from an XML file in the
current directory (or, as you'll see below, from some
part of the distribution) ... I can't easily tell.
What follows was done on a Mac;
"$" is a placeholder for the shell prompt.
Three tests:
* The first test shows what I expected to be the
behaviour for data read from standard input.
* The second test shows when standard input is
empty (echo -n ''): an exception.
* The third test shows when standard input contains
just a blank line (echo ''): it seems to read from the
factbook.xml data (from basex/etc/factbook.xml?)
$ mkdir basex-report
$ cd basex-report
$ wget http://files.basex.org/releases/9.0.2/BaseX902.zip
... output omitted ...
$ unzip BaseX902.zip
Archive: BaseX902.zip
extracting: basex/.basexhome
inflating: basex/BaseX.jar
creating: basex/bin/
inflating: basex/bin/basex
inflating: basex/bin/basex.bat
... etc.
$ echo '<x />' | basex/bin/basex -i- -q '.'
/Users/rwalker/basex-report/basex/.basex: writing new configuration file.
<x/>$ <-- shell prompt printed immediately after output
$ echo -n '' | basex/bin/basex -i- -q '.'
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:862)
at java.util.Scanner.next(Scanner.java:1371)
at org.basex.util.MainParser.string(MainParser.java:110)
at org.basex.BaseX.parseArgs(BaseX.java:235)
at org.basex.core.CLI.<init>(CLI.java:50)
at org.basex.BaseX.<init>(BaseX.java:55)
at org.basex.BaseX.main(BaseX.java:42)
$ echo '' | basex/bin/basex -i- -q '.'
<mondial>
<continent id="f0_119" name="Europe"/>
<continent id="f0_123" name="Asia"/>
<continent id="f0_126" name="America"/>
<continent id="f0_129" name="Australia/Oceania"/>
<continent id="f0_132" name="Africa"/>
<country id="f0_136" name="Albania" capital="f0_1461" population="3249136" datacode="AL" total_area="28750" population_growth="1.34" infant_mortality="49.2" gdp_agri="55" gdp_total="4100" inflation="16" indep_date="28 11 1912" government="emerging democracy" car_code="AL">
<name>Albania</name>
<city id="f0_1461" country="f0_136" longitude="10.7" latitude="46.2">
<name>Tirane</name>
... etc.CG
Christian Grün22 Aug 2018 17:06 #
Hi Richard,
Newlines (i.e., whitespace-only, non-empty strings) were treated identically to the "." file reference. As you can also supply absolute and relative file and directory paths as arguments for the -i flag, the factbook.xml file, which is located in a descendant directory of your current directory, was opened instead and bound to the context item.
This special case will now be checked. In addition, the error message for empty strings will now be suppressed. Feel free to check out the latest stable snapshot [1].
Best,
Christian
[1] http://files.basex.org/releases/latest/
Quoted text · Richard Walker · 64 lines
> Further clarification/correction to what I reported: > > * When I said "empty string", in fact the "problem" arises > when standard input is _not_ empty, but includes just a > blank line. > * When standard input is empty, I get an exception > NoSuchElementException. That is probably acceptable: > at least, it is better than getting output that has > nothing to do with the input data. > * When I said "one of my databases", I think that _may_ have > been wrong. It may be content from an XML file in the > current directory (or, as you'll see below, from some > part of the distribution) ... I can't easily tell. > > What follows was done on a Mac; > "$" is a placeholder for the shell prompt. > > Three tests: > * The first test shows what I expected to be the > behaviour for data read from standard input. > * The second test shows when standard input is > empty (echo -n ''): an exception. > * The third test shows when standard input contains > just a blank line (echo ''): it seems to read from the > factbook.xml data (from basex/etc/factbook.xml?) > > > $ mkdir basex-report > $ cd basex-report > $ wget http://files.basex.org/releases/9.0.2/BaseX902.zip > ... output omitted ... > $ unzip BaseX902.zip > Archive: BaseX902.zip > extracting: basex/.basexhome > inflating: basex/BaseX.jar > creating: basex/bin/ > inflating: basex/bin/basex > inflating: basex/bin/basex.bat > ... etc. > $ echo '<x />' | basex/bin/basex -i- -q '.' > /Users/rwalker/basex-report/basex/.basex: writing new configuration file. > <x/>$ <-- shell prompt printed immediately after output > $ echo -n '' | basex/bin/basex -i- -q '.' > Exception in thread "main" java.util.NoSuchElementException > at java.util.Scanner.throwFor(Scanner.java:862) > at java.util.Scanner.next(Scanner.java:1371) > at org.basex.util.MainParser.string(MainParser.java:110) > at org.basex.BaseX.parseArgs(BaseX.java:235) > at org.basex.core.CLI.<init>(CLI.java:50) > at org.basex.BaseX.<init>(BaseX.java:55) > at org.basex.BaseX.main(BaseX.java:42) > $ echo '' | basex/bin/basex -i- -q '.' > <mondial> > <continent id="f0_119" name="Europe"/> > <continent id="f0_123" name="Asia"/> > <continent id="f0_126" name="America"/> > <continent id="f0_129" name="Australia/Oceania"/> > <continent id="f0_132" name="Africa"/> > <country id="f0_136" name="Albania" capital="f0_1461" population="3249136" datacode="AL" total_area="28750" population_growth="1.34" infant_mortality="49.2" gdp_agri="55" gdp_total="4100" inflation="16" indep_date="28 11 1912" government="emerging democracy" car_code="AL"> > <name>Albania</name> > <city id="f0_1461" country="f0_136" longitude="10.7" latitude="46.2"> > <name>Tirane</name> > ... etc. >
RW
Richard Walker23 Aug 2018 01:33 #
Quoted text · Christian Grün · 4 lines
On 23 Aug 2018, at 1:06 am, Christian Grün <christian.gruen at gmail.com> wrote: > Feel free to check out the latest stable snapshot [1]. > > [1] http://files.basex.org/releases/latest/
Works well for me; thank you.
Written for BaseX 9.0. BaseX may have changed since: please check the current documentation.
⚡Generated with XQuery