Commit 1756b665 authored by LE Manh Cuong's avatar LE Manh Cuong Committed by Brad Fitzpatrick

os: make ExpandEnv recognize '-' as a special shell parameter

'-' is one of shell special parameters.

The existing implementation of isShellSpecialVar missed '-'
from the list, causing "$-" and "${-}" expand differently.

Fixes #16554

Change-Id: Iafc7984692cc83cff58f7c1e01267bf78b3a20a9
Reviewed-on: https://go-review.googlesource.com/25352Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent 4338e5a8
...@@ -37,7 +37,7 @@ func ExpandEnv(s string) string { ...@@ -37,7 +37,7 @@ func ExpandEnv(s string) string {
// shell variable such as $*. // shell variable such as $*.
func isShellSpecialVar(c uint8) bool { func isShellSpecialVar(c uint8) bool {
switch c { switch c {
case '*', '#', '$', '@', '!', '?', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': case '*', '#', '$', '@', '!', '?', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
return true return true
} }
return false return false
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
package os_test package os_test
import ( import (
"fmt"
. "os" . "os"
"testing" "testing"
) )
...@@ -28,3 +29,28 @@ func TestSetenvUnixEinval(t *testing.T) { ...@@ -28,3 +29,28 @@ func TestSetenvUnixEinval(t *testing.T) {
} }
} }
} }
var shellSpecialVarTests = []struct {
k, v string
}{
{"*", "asterisk"},
{"#", "pound"},
{"$", "dollar"},
{"@", "at"},
{"!", "exclamation mark"},
{"?", "question mark"},
{"-", "dash"},
}
func TestExpandEnvShellSpecialVar(t *testing.T) {
for _, tt := range shellSpecialVarTests {
Setenv(tt.k, tt.v)
defer Unsetenv(tt.k)
argRaw := fmt.Sprintf("$%s", tt.k)
argWithBrace := fmt.Sprintf("${%s}", tt.k)
if gotRaw, gotBrace := ExpandEnv(argRaw), ExpandEnv(argWithBrace); gotRaw != gotBrace {
t.Errorf("ExpandEnv(%q) = %q, ExpandEnv(%q) = %q; expect them to be equal", argRaw, gotRaw, argWithBrace, gotBrace)
}
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment