If you have a recent TeX Live (2010 or later) or MiKTeX (v. 2.9), then the following works (and does not need the -shell-escape
command line option):
\usepackage{catchfile}
\newcommand{\getenv}[2][]{%
\CatchFileEdef{\temp}{"|kpsewhich --var-value #2"}{\endlinechar=-1}%
\if\relax\detokenize{#1}\relax\temp\else\let#1\temp\fi}
\getenv[\HOME]{HOME}
If you only say \getenv{VAR}
then the value of the variable is printed instead of being stored in a control sequence.
Not only HOME
can be used, but any environment variable and also the "pseudovariables" defined in the TeX kpathsea
system such as TEXMF
or TEXINPUTS
.
Note that this works only with pdflatex
. With other engines or older distributions, shell escape is needed. Of course LuaTeX has its methods for interacting with the system.
A version that works with all recent engines is
\documentclass{article}
\usepackage{ifxetex,ifluatex}
\ifxetex
\usepackage{catchfile}
\newcommand\getenv[2][]{%
\immediate\write18{kpsewhich --var-value #2 > \jobname.tmp}%
\CatchFileDef{\temp}{\jobname.tmp}{\endlinechar=-1}%
\if\relax\detokenize{#1}\relax\temp\else\let#1\temp\fi}
\else
\ifluatex
\newcommand\getenv[2][]{%
\edef\temp{\directlua{tex.sprint(
kpse.var_value("\luatexluaescapestring{#2}") or "" ) }}%
\if\relax\detokenize{#1}\relax\temp\else\let#1\temp\fi}
\else
\usepackage{catchfile}
\newcommand{\getenv}[2][]{%
\CatchFileEdef{\temp}{"|kpsewhich --var-value #2"}{\endlinechar=-1}%
\if\relax\detokenize{#1}\relax\temp\else\let#1\temp\fi}
\fi
\fi
\begin{document}
\getenv[\HOME]{HOME}\show\HOME
\end{document}
In the case of xetex
an auxiliary file \jobname.tmp
is written and -shell-escape
is necessary.
Note: the LuaTeX method has been suggested by Patrick Gundlach. If the variable is unset or not known to kpathsea
, the empty string will result.
UPDATE 2019
With recent and up-to-date TeX distributions, the following works with every engine (except, of course, Knuth TeX): pdflatex
, xelatex
, lualatex
, platex
and uplatex
. Unrestricted shell escape is not necessary.
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\getenv}{om}
{
\sys_get_shell:nnN { kpsewhich ~ --var-value ~ #2 } { } \l_tmpa_tl
\tl_trim_spaces:N \l_tmpa_tl
\IfNoValueTF { #1 }
{
\tl_use:N \l_tmpa_tl
}
{
\tl_set_eq:NN #1 \l_tmpa_tl
}
}
\ExplSyntaxOff
\begin{document}
\getenv[\HOME]{HOME}\show\HOME
\end{document}