かまたま日記3

プログラミングメイン、たまに日常

envsubstで簡易テンプレートを実現する

設定ファイルとかで一部だけ可変にしたテンプレートを使いたいんだけど、RubyとかPerlみたいな別言語を使うまでも無くシェルスクリプトだけで完結したい場合、envsubstコマンドを使うとテンプレートに環境変数を埋め込むことが出来ます。

インストール (on Ubuntu)

% docker run -it --rm ubuntu:16.04 

root@a70695314424:/# apt-get update
root@a70695314424:/# apt-get install gettext-base -y
root@a70695314424:/# envsubst --version
envsubst (GNU gettext-runtime) 0.19.7
Copyright (C) 2003-2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Bruno Haible.

使い方

root@a70695314424:/# envsubst --help
Usage: envsubst [OPTION] [SHELL-FORMAT]

Substitutes the values of environment variables.

Operation mode:
  -v, --variables             output the variables occurring in SHELL-FORMAT

Informative output:
  -h, --help                  display this help and exit
  -V, --version               output version information and exit

In normal operation mode, standard input is copied to standard output,
with references to environment variables of the form $VARIABLE or ${VARIABLE}
being replaced with the corresponding values.  If a SHELL-FORMAT is given,
only those environment variables that are referenced in SHELL-FORMAT are
substituted; otherwise all environment variables references occurring in
standard input are substituted.

When --variables is used, standard input is ignored, and the output consists
of the environment variables that are referenced in SHELL-FORMAT, one per line.

Report bugs to <bug-gnu-gettext@gnu.org>.

標準入力が標準出力にアウトプットされます。標準入力中の $VARIABLE もしくは ${VARIABLE} が実際の環境変数に置換されます。

root@a70695314424:/# echo 'pwd=${PWD}' > sample.tpl
root@a70695314424:/# envsubst < sample.tpl
pwd=/

基本的にはファイルに書き込んで使います

root@a70695314424:/# envsubst < sample.tpl > sample.txt
root@a70695314424:/# cat sample.txt
pwd=/

SHELL-FORMAT が指定されてる場合、そこに書かれている変数だけが使われます、デフォルトは全環境変数が利用可能

root@a70695314424:/# echo 'pwd=${PWD} home=${HOME}' > sample.tpl
root@a70695314424:/# envsubst '$HOME' < sample.tpl
pwd=${PWD} home=/root

--variables が指定されてる場合、標準入力は無視されて SHELL-FORMAT で指定されている変数が出力されます (値ではない)。

root@a70695314424:/# envsubst --variables '$HOME $PWD FOO'
HOME
PWD