MCPcopy Index your code
hub / github.com/a8m/envsubst

github.com/a8m/envsubst @v1.4.3

Chat with this repo
repository ↗ · DeepWiki ↗ · release v1.4.3 ↗ · + Follow
81 symbols 177 edges 10 files 43 documented · 53% 19 cross-repo links
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

envsubst

GoDoc License Build status Github All Releases

Environment variables substitution for Go. see docs below

Installation:

From binaries

Latest stable envsubst prebuilt binaries for 64-bit Linux, or Mac OS X are available via Github releases.

Linux and MacOS
curl -L https://github.com/a8m/envsubst/releases/download/v1.2.0/envsubst-`uname -s`-`uname -m` -o envsubst
chmod +x envsubst
sudo mv envsubst /usr/local/bin
Windows

Download the latest prebuilt binary from releases page, or if you have curl installed:

curl -L https://github.com/a8m/envsubst/releases/download/v1.2.0/envsubst.exe
With go

You can install via go get (provided you have installed go):

go get github.com/a8m/envsubst/cmd/envsubst

Using via cli

envsubst < input.tmpl > output.text
echo 'welcome $HOME ${USER:=a8m}' | envsubst
envsubst -help

Imposing restrictions

There are three command line flags with which you can cause the substitution to stop with an error code, should the restriction associated with the flag not be met. This can be handy if you want to avoid creating e.g. configuration files with unset or empty parameters. Setting a -fail-fast flag in conjunction with either no-unset or no-empty or both will result in a faster feedback loop, this can be especially useful when running through a large file or byte array input, otherwise a list of errors is returned.

The flags and their restrictions are:

Option Meaning Type Default
-i input file string \| stdin stdin
-o output file string \| stdout stdout
-no-digit do not replace variables starting with a digit, e.g. $1 and ${1} flag false
-no-unset fail if a variable is not set flag false
-no-empty fail if a variable is set but empty flag false
-fail-fast fails at first occurrence of an error, if -no-empty or -no-unset flags were not specified this is ignored flag false

These flags can be combined to form tighter restrictions.

Using envsubst programmatically ?

You can take a look on _example/main or see the example below.

package main

import (
    "fmt"
    "github.com/a8m/envsubst"
)

func main() {
    input := "welcome $HOME"
    str, err := envsubst.String(input)
    // ...
    buf, err := envsubst.Bytes([]byte(input))
    // ...
    buf, err := envsubst.ReadFile("filename")
}

Docs

api docs here: GoDoc

Expression Meaning
${var} Value of var (same as $var)
${var-$DEFAULT} If var not set, evaluate expression as $DEFAULT
${var:-$DEFAULT} If var not set or is empty, evaluate expression as $DEFAULT
${var=$DEFAULT} If var not set, evaluate expression as $DEFAULT
${var:=$DEFAULT} If var not set or is empty, evaluate expression as $DEFAULT
${var+$OTHER} If var set, evaluate expression as $OTHER, otherwise as empty string
${var:+$OTHER} If var set, evaluate expression as $OTHER, otherwise as empty string
$$var Escape expressions. Result will be $var.

Most of the rows in this table were taken from here

See also

  • os.ExpandEnv(s string) string - only supports $var and ${var} notations

License

MIT

Extension points exported contracts — how you extend this code

Node (Interface)
(no doc)
parse/node.go

Core symbols most depended-on inside this repo

emit
called by 17
parse/lex.go
next
called by 10
parse/lex.go
String
called by 9
parse/node.go
Parse
called by 6
parse/parse.go
usageAndExit
called by 5
cmd/envsubst/main.go
isSet
called by 4
parse/node.go
next
called by 4
parse/parse.go
isAlphaNumeric
called by 4
parse/lex.go

Shape

Function 35
Method 28
Struct 10
TypeAlias 6
FuncType 1
Interface 1

Languages

Go100%

Modules by API surface

parse/lex.go21 symbols
parse/node.go16 symbols
parse/parse.go11 symbols
parse/parse_test.go9 symbols
envsubst.go9 symbols
parse/lex_test.go4 symbols
parse/env.go4 symbols
cmd/envsubst/main.go3 symbols
envsubst_test.go2 symbols
_example/main.go2 symbols

For agents

$ claude mcp add envsubst \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact