Re: [Rd] Sys.timezone() fails on Linux under Microsoft WSL
One way to avoid the call to timedatectl is to set the `TZ` environment variable on your machine to your local timezone, if this is set `Sys.timezone()` uses this and does not try to query timedatectl for the timezone. This is a common issue as well in docker containers, as like on WSL in docker timedatectl is present, but non-functional. Jim On Tue, Apr 13, 2021 at 9:19 AM Brenton Wiernik wrote: > In Microsoft’s Windows Subsystem for Linux (WSL or WSL2), there is not > system framework, so utilities that depend on it fail. This includes > timedatectl which R uses in Sys.timezone(). The timedatectl utility is > present on Linux systems installed under WSL/WSL2, but is non-functional. > So, when Sys.timezone() checks for Sys.which("timedatectl"), it receives a > false positive. The subsequent methods after this if () do work, however. > > This can be fixed if line 42 of Sys.timezone() were changed from: > if (nzchar(Sys.which("timedatectl"))) { > > to: > if (nzchar(Sys.which("timedatectl")) && !grepl("microsoft", system("uname > -r", intern = TRUE), ignore.case = TRUE)) { > > "uname -r" returns for example: > "5.4.72-microsoft-standard-WSL2" > > So checking for "microsoft" or "WSL" would probably work. > > > Brenton Wiernik > > > > [[alternative HTML version deleted]] > > __ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > [[alternative HTML version deleted]] __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
Re: [Rd] Sys.timezone() fails on Linux under Microsoft WSL
That would work. Sys.info()['release'] # release # "5.4.72-microsoft-standard-WSL2" Brenton From: Martin Maechler Sent: Wednesday, April 14, 2021 03:28 To: Brenton Wiernik Cc: r-devel@r-project.org Subject: Re: [Rd] Sys.timezone() fails on Linux under Microsoft WSL >>>>> Brenton Wiernik >>>>> on Tue, 13 Apr 2021 09:15:50 -0400 writes: > In Microsoft’s Windows Subsystem for Linux (WSL or WSL2), > there is not system framework, so utilities that depend on > it fail. This includes timedatectl which R uses in > Sys.timezone(). The timedatectl utility is present on > Linux systems installed under WSL/WSL2, but is > non-functional. So, when Sys.timezone() checks for > Sys.which("timedatectl"), it receives a false > positive. The subsequent methods after this if () do work, > however. > This can be fixed if line 42 of Sys.timezone() were changed from: > if (nzchar(Sys.which("timedatectl"))) { > to: > if (nzchar(Sys.which("timedatectl")) && !grepl("microsoft", system("uname -r", intern = TRUE), ignore.case = TRUE)) { > "uname -r" returns for example: "5.4.72-microsoft-standard-WSL2" > So checking for "microsoft" or "WSL" would probably work. > Brenton Wiernik Thank you. This all makes sense. However, using system("uname -r") creates another platform dependency (it fails, i.e., signals an error, e.g., on our Windows Server). Could Sys.info() be used instead? What does it give on your platform? > [[alternative HTML version deleted]] > __ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel [[alternative HTML version deleted]] __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
Re: [Rd] Sys.timezone() fails on Linux under Microsoft WSL
> Brenton Wiernik > on Tue, 13 Apr 2021 09:15:50 -0400 writes: > In Microsoft’s Windows Subsystem for Linux (WSL or WSL2), > there is not system framework, so utilities that depend on > it fail. This includes timedatectl which R uses in > Sys.timezone(). The timedatectl utility is present on > Linux systems installed under WSL/WSL2, but is > non-functional. So, when Sys.timezone() checks for > Sys.which("timedatectl"), it receives a false > positive. The subsequent methods after this if () do work, > however. > This can be fixed if line 42 of Sys.timezone() were changed from: > if (nzchar(Sys.which("timedatectl"))) { > to: > if (nzchar(Sys.which("timedatectl")) && !grepl("microsoft", system("uname -r", intern = TRUE), ignore.case = TRUE)) { > "uname -r" returns for example: "5.4.72-microsoft-standard-WSL2" > So checking for "microsoft" or "WSL" would probably work. > Brenton Wiernik Thank you. This all makes sense. However, using system("uname -r") creates another platform dependency (it fails, i.e., signals an error, e.g., on our Windows Server). Could Sys.info() be used instead? What does it give on your platform? > [[alternative HTML version deleted]] > __ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
[Rd] Sys.timezone() fails on Linux under Microsoft WSL
In Microsoft’s Windows Subsystem for Linux (WSL or WSL2), there is not system framework, so utilities that depend on it fail. This includes timedatectl which R uses in Sys.timezone(). The timedatectl utility is present on Linux systems installed under WSL/WSL2, but is non-functional. So, when Sys.timezone() checks for Sys.which("timedatectl"), it receives a false positive. The subsequent methods after this if () do work, however. This can be fixed if line 42 of Sys.timezone() were changed from: if (nzchar(Sys.which("timedatectl"))) { to: if (nzchar(Sys.which("timedatectl")) && !grepl("microsoft", system("uname -r", intern = TRUE), ignore.case = TRUE)) { "uname -r" returns for example: "5.4.72-microsoft-standard-WSL2" So checking for "microsoft" or "WSL" would probably work. Brenton Wiernik [[alternative HTML version deleted]] __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel