github.com/teddydd/sh@v2.6.4+incompatible/interp/example_test.go (about)

     1  // Copyright (c) 2018, Daniel Martí <mvdan@mvdan.cc>
     2  // See LICENSE for licensing information
     3  
     4  package interp_test
     5  
     6  import (
     7  	"context"
     8  	"os"
     9  	"strings"
    10  
    11  	"mvdan.cc/sh/expand"
    12  	"mvdan.cc/sh/interp"
    13  	"mvdan.cc/sh/syntax"
    14  )
    15  
    16  func Example() {
    17  	src := `
    18  		foo=abc
    19  		for i in 1 2 3; do
    20  			foo+=$i
    21  		done
    22  		let bar=(2 + 3)
    23  		echo $foo $bar
    24  		echo $GLOBAL
    25  	`
    26  	file, _ := syntax.NewParser().Parse(strings.NewReader(src), "")
    27  	runner, _ := interp.New(
    28  		interp.Env(expand.ListEnviron("GLOBAL=global_value")),
    29  		interp.StdIO(nil, os.Stdout, os.Stdout),
    30  	)
    31  	runner.Run(context.TODO(), file)
    32  	// Output:
    33  	// abc123 5
    34  	// global_value
    35  }
    36  
    37  func ExampleModuleExec() {
    38  	src := `
    39  		ls example_test.* || echo "ls failed"
    40  		rm example_test.* || echo "rm failed"
    41  	`
    42  	file, _ := syntax.NewParser().Parse(strings.NewReader(src), "")
    43  	exec := func(ctx context.Context, path string, args []string) error {
    44  		switch args[0] {
    45  		case "ls":
    46  			// whitelist the "ls" program
    47  			return interp.DefaultExec(ctx, path, args)
    48  		default:
    49  			// refuse to run any other program
    50  			return interp.ExitStatus(1)
    51  		}
    52  	}
    53  	runner, _ := interp.New(
    54  		interp.StdIO(nil, os.Stdout, os.Stdout),
    55  		interp.Module(interp.ModuleExec(exec)),
    56  	)
    57  	runner.Run(context.TODO(), file)
    58  	// Output:
    59  	// example_test.go
    60  	// rm failed
    61  }