From tom@@@k@||ber@ @end|ng |rom gm@||@com  Wed Nov  3 11:30:37 2021
From: tom@@@k@||ber@ @end|ng |rom gm@||@com (Tomas Kalibera)
Date: Wed, 3 Nov 2021 11:30:37 +0100
Subject: [Rd] Fwd: Using existing envars in Renviron on friendly Windows
In-Reply-To: <CAFDcVCRn1kKeEPCqzjMrcCN=38GZa_ODHRvO6Oq8GccoaxX7bg@mail.gmail.com>
References: <CAByPayHQ33kLY+S6U6NGAzHRuMZJQhaoPhbCDGt6EpgAU9aB5w@mail.gmail.com>
 <CAByPayFCM72e32p6aBshSa0oD0wijUkRQ-vKKT9Aq2YD5rKrpg@mail.gmail.com>
 <20211015194037.595b389f@Tarkus>
 <CAByPayFOobioF-W6Xt=6vkEw2srbg1xc9p6YvyO+r-yu=4doTg@mail.gmail.com>
 <CAByPayEZskmsn1bsFACYvxUC+ENaDfyoJsvbxwxLKc8gNyRgzQ@mail.gmail.com>
 <3ec44e42-f7af-575c-1b69-fe7e2bda00b2@gmail.com>
 <CAByPayH4dzWOqnaFg0z=UxjgHp6BSNrP17DP3RJ4qLPfw6q33A@mail.gmail.com>
 <24945.33990.369010.718929@stat.math.ethz.ch>
 <38f36d15-c08e-d57c-41f7-31dcc9449e84@gmail.com>
 <CAFDcVCSmQO43H7Jpj132ba13Lg0GfyFQoa+ev0st5kH3bhZL4A@mail.gmail.com>
 <87e89990-ebc4-6879-a34e-4301c3b83563@gmail.com>
 <CAFDcVCRn1kKeEPCqzjMrcCN=38GZa_ODHRvO6Oq8GccoaxX7bg@mail.gmail.com>
Message-ID: <a85d0f84-413f-944a-ed8f-1a3420a231b4@gmail.com>


On 11/3/21 1:37 AM, Henrik Bengtsson wrote:
> Oh, I see, I misunderstood.  Thanks for clarifying.
>
> One more thing, to mix-and-match environment variables and strings
> with escaped characters, while mimicking how POSIX shells does it, by
> using strings with double and single quotes. For example, with:
>
> $ cat .Renviron
> APPDATA='C:\Users\foobar\AppData\Roaming'
> R_LIBS_USER="${APPDATA}"'\R-library'
>
> we get:
>
> $ Rscript --no-init-file --quiet -e 'cat(sprintf("R_LIBS_USER=[%s]\n",
> Sys.getenv("R_LIBS_USER")))'
> R_LIBS_USER=[C:\Users\foobar\AppData\Roaming\R-library]
>
> and
>
> $ source .Renviron
> $ echo "R_LIBS_USER=[${R_LIBS_USER}]"
> R_LIBS_USER=[C:\Users\foobar\AppData\Roaming\R-library]
Yes, that could be mentioned explicitly as well.

Tomas


>
> /Henrik
>
> On Sun, Oct 31, 2021 at 2:59 AM Tomas Kalibera <tomas.kalibera at gmail.com> wrote:
>>
>> On 10/31/21 2:55 AM, Henrik Bengtsson wrote:
>>>> ... If one still needed backslashes,
>>>> they could then be entered in single quotes, e.g. VAR='c:\users'.
>>> I don't think it matters whether you use single or double quotes -
>>> both will work.  Here's a proof of concept on Linux with R 4.1.1:
>>>
>>> $ cat ./.Renviron
>>> A=C:\users
>>> B='C:\users'
>>> C="C:\users"
>>>
>>> $ Rscript -e "Sys.getenv(c('A', 'B', 'C'))"
>>>             A           B           C
>>>     "C:users" "C:\\users" "C:\\users"
>> Yes, but as I wrote "I think the Renviron files should be written in a
>> way so that they would work the same in a POSIX shell". This is why
>> single quotes. With double quotes, backslashes are interpreted
>> differently from a POSIX shell.
>>
>> Tomas
>>
>>
>>> /Henrik
>>>
>>> On Wed, Oct 27, 2021 at 11:45 AM Tomas Kalibera
>>> <tomas.kalibera at gmail.com> wrote:
>>>> On 10/21/21 5:18 PM, Martin Maechler wrote:
>>>>>>>>>> Micha? Bojanowski
>>>>>>>>>>        on Wed, 20 Oct 2021 16:31:08 +0200 writes:
>>>>>        > Hello Tomas,
>>>>>        > Yes, that's accurate although rather terse, which is perhaps the
>>>>>        > reason why I did not realize it applies to my case.
>>>>>
>>>>>        > How about adding something in the direction of:
>>>>>
>>>>>        > 1. Continuing the cited paragraph with:
>>>>>        > In particular, on Windows it may be necessary to quote references to
>>>>>        > existing environment variables, especially those containing file paths
>>>>>        > (which include backslashes). For example: `"${WINVAR}"`.
>>>>>
>>>>>        > 2. Add an example (not run):
>>>>>
>>>>>        > # On Windows do quote references to variables containing paths, e.g.:
>>>>>        > # If APPDATA=C:\Users\foobar\AppData\Roaming
>>>>>        > # to point to a library tree inside APPDATA in .Renviron use
>>>>>        > R_LIBS_USER="${APPDATA}"/R-library
>>>>>
>>>>>        > Incidentally the last example is on backslashes too.
>>>>>
>>>>>
>>>>>        > What do you think?
>>>>>
>>>>> I agree that adding an example really helps a lot in such cases,
>>>>> in my experience, notably if it's precise enough to be used +/- directly.
>>>> Yes, I agree as well. I think the Renviron files should be written in a
>>>> way so that they would work the same in a POSIX shell, so e.g.
>>>> VAR="${VAR0}" or VAR="${VAR0}/subdir" are the recommended ways to
>>>> preserve backslashes in VAR0. It is better to use forward slashes in
>>>> string literals, e.g. VAR="c:/users". If one still needed backslashes,
>>>> they could then be entered in single quotes, e.g. VAR='c:\users'.
>>>>
>>>> The currently implemented parsing of Renviron files differs in a number
>>>> of details from POSIX shells, some are documented and some are not.
>>>> Relying only on the documented behavior that is the same as in POSIX
>>>> shells is the best choice for future compatibility.
>>>>
>>>> Tomas
>>>>
>>>>>        > On Mon, Oct 18, 2021 at 5:02 PM Tomas Kalibera <tomas.kalibera at gmail.com> wrote:
>>>>>        >>
>>>>>        >>
>>>>>        >> On 10/15/21 6:44 PM, Micha? Bojanowski wrote:
>>>>>        >> > Perhaps a small update to ?.Renviron would be in order to mention that...
>>>>>        >>
>>>>>        >> Would you have a more specific suggestion how to update the
>>>>>        >> documentation? Please note that it already says
>>>>>        >>
>>>>>        >> "?value? is then processed in a similar way to a Unix shell: in
>>>>>        >> particular the outermost level of (single or double) quotes is stripped,
>>>>>        >> and backslashes are removed except inside quotes."
>>>>>        >>
>>>>>        >> Thanks,
>>>>>        >> Tomas
>>>>>        >>
>>>>>        >> > On Fri, Oct 15, 2021 at 6:43 PM Micha? Bojanowski <michal2992 at gmail.com> wrote:
>>>>>        >> >> Indeed quoting works! Kevin suggested the same, but he didnt reply to the list.
>>>>>        >> >> Thank you all!
>>>>>        >> >> Michal
>>>>>        >> >>
>>>>>        >> >> On Fri, Oct 15, 2021 at 6:40 PM Ivan Krylov <krylov.r00t at gmail.com> wrote:
>>>>>        >> >>> Sorry for the noise! I wasn't supposed to send my previous message.
>>>>>        >> >>>
>>>>>        >> >>> On Fri, 15 Oct 2021 16:44:28 +0200
>>>>>        >> >>> Micha? Bojanowski <michal2992 at gmail.com> wrote:
>>>>>        >> >>>
>>>>>        >> >>>> AVAR=${APPDATA}/foo/bar
>>>>>        >> >>>>
>>>>>        >> >>>> Which is a documented way of referring to existing environment
>>>>>        >> >>>> variables. Now, with that in R I'm getting:
>>>>>        >> >>>>
>>>>>        >> >>>> Sys.getenv("APPDATA")    # That works OK
>>>>>        >> >>>> [1] "C:\\Users\\mbojanowski\\AppData\\Roaming"
>>>>>        >> >>>>
>>>>>        >> >>>> so OK, but:
>>>>>        >> >>>>
>>>>>        >> >>>> Sys.getenv("AVAR")
>>>>>        >> >>>> [1] "C:UsersmbojanowskiAppDataRoaming/foo/bar"
>>>>>        >> >>> Hmm, a function called by readRenviron does seem to remove backslashes,
>>>>>        >> >>> but not if they are encountered inside quotes:
>>>>>        >> >>>
>>>>>        >> >>> https://github.com/r-devel/r-svn/blob/3f8b75857fb1397f9f3ceab6c75554e1a5386adc/src/main/Renviron.c#L149
>>>>>        >> >>>
>>>>>        >> >>> Would AVAR="${APPDATA}"/foo/bar work?
>>>>>        >> >>>
>>>>>        >> >>> --
>>>>>        >> >>> Best regards,
>>>>>        >> >>> Ivan
>>>>>        >> > ______________________________________________
>>>>>        >> > R-devel at r-project.org mailing list
>>>>>        >> > https://stat.ethz.ch/mailman/listinfo/r-devel
>>>>>
>>>>>        > ______________________________________________
>>>>>        > R-devel at r-project.org mailing list
>>>>>        > https://stat.ethz.ch/mailman/listinfo/r-devel
>>>> ______________________________________________
>>>> R-devel at r-project.org mailing list
>>>> https://stat.ethz.ch/mailman/listinfo/r-devel



[Rd] Fwd: Using existing envars in Renviron on friendly Windows
Tomas Kalibera