MichaĆ Bojanowski
2021-Oct-20 14:31 UTC
[Rd] Fwd: Using existing envars in Renviron on friendly Windows
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?
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
Henrik Bengtsson
2021-Oct-20 18:22 UTC
[Rd] Fwd: Using existing envars in Renviron on friendly Windows
Two comments/suggestions:
1. What about recommending to always quote the value in Renviron
files, e.g. ABC="Hello world" and
DEF="${APPDATA}/R-library"? This
should a practice that works on all platforms.
2. What about having readRenviron() escapes strings it imports via
environment variables? See example below. Is there ever a use case
where someone wants/needs, or even rely on, the current behavior? (I
would even like to argue the current behavior is a design bug that
should be fixed.) As an analogue from the shell world, Bash escapes
its input.
To illustrate the latter, with:
A=C:\\ABC
B=${A}
C="${A}"
or equivalently:
A="C:\ABC"
B=${A}
C="${A}"
we currently get:
$ Rscript -e "Sys.getenv(c('A', 'B', 'C'))"
A B C
"C:\\ABC" "C:ABC" "C:\\ABC"
If base::readRenviron() would escape "input" environment variables, we
would get identical values for both 'B' and 'C', which I think
is what
most people would expect.
To be clear, this is a problem that occur on all platforms, but it's
more likely to be revealed on MS Windows since paths uses backslashes,
but you could image a Linux user using something like
A="Hello\nworld\n" and would also be surprised about the above
behavior, when they end up with B="Hellonworldn".
/Henrik
On Wed, Oct 20, 2021 at 7:31 AM Micha? Bojanowski <michal2992 at
gmail.com> wrote:>
> 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?
>
> 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
Martin Maechler
2021-Oct-21 15:18 UTC
[Rd] Fwd: Using existing envars in Renviron on friendly Windows
>>>>> 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. > 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