設定ファイルとかで一部だけ可変にしたテンプレートを使いたいんだけど、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