From 5afe35cca6d0b819cf8e2f44e7882a5f480aae1b Mon Sep 17 00:00:00 2001 From: Neved4 <63655535+Neved4@users.noreply.github.com> Date: Sat, 16 Nov 2024 23:13:01 +0100 Subject: [PATCH 1/5] Add filter to `set` flags --- translate/translate.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/translate/translate.go b/translate/translate.go index f469b34..3e5901b 100644 --- a/translate/translate.go +++ b/translate/translate.go @@ -424,6 +424,19 @@ func (t *Translator) assign(prefix string, a *syntax.Assign) { } } +func (t *Translator) parseSetExp(args []*syntax.Word) bool { + if len(args) < 2 { + return false + } + for _, arg := range args[1:] { + flag, _ := lit(arg) + if !strings.HasPrefix(flag, "-") { + return false + } + } + return true +} + func (t *Translator) callExpr(c *syntax.CallExpr) { if len(c.Args) == 0 { // assignment @@ -447,7 +460,12 @@ func (t *Translator) callExpr(c *syntax.CallExpr) { first := c.Args[0] l, _ := lit(first) + switch l { + case "set": + if t.parseSetExp(c.Args) { + return + } case "shift": t.str("set -e argv[1]") case "unset": From c2e4991ad6507409207c96380014bae3ea429ea9 Mon Sep 17 00:00:00 2001 From: Neved4 <63655535+Neved4@users.noreply.github.com> Date: Sat, 16 Nov 2024 23:37:52 +0100 Subject: [PATCH 2/5] Add parsing from `set --` to `set argv` --- translate/translate.go | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/translate/translate.go b/translate/translate.go index 3e5901b..aeba46b 100644 --- a/translate/translate.go +++ b/translate/translate.go @@ -424,10 +424,24 @@ func (t *Translator) assign(prefix string, a *syntax.Assign) { } } -func (t *Translator) parseSetExp(args []*syntax.Word) bool { +func (t *Translator) parseSetExpr(args []*syntax.Word) bool { if len(args) < 2 { return false } + + next, _ := lit(args[1]) + + if next == "--" { + if len(args) > 2 { + t.str("set argv") + for _, arg := range args[2:] { + t.str(" ") + t.word(arg, false) + } + } + return true + } + for _, arg := range args[1:] { flag, _ := lit(arg) if !strings.HasPrefix(flag, "-") { @@ -463,7 +477,7 @@ func (t *Translator) callExpr(c *syntax.CallExpr) { switch l { case "set": - if t.parseSetExp(c.Args) { + if t.parseSetExpr(c.Args) { return } case "shift": From cc82ec0187ba685b6c0e57747a6e8d7edf160d6f Mon Sep 17 00:00:00 2001 From: Neved4 <63655535+Neved4@users.noreply.github.com> Date: Mon, 18 Nov 2024 16:08:03 +0100 Subject: [PATCH 3/5] Add tests for `set --` and `set -Cefu` --- translate/translate_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/translate/translate_test.go b/translate/translate_test.go index cb49996..6a993c4 100644 --- a/translate/translate_test.go +++ b/translate/translate_test.go @@ -333,6 +333,8 @@ echo ${cool+a} echo ${cool:+a} echo ${cool-a} echo ${cool:-a} +set -Cefu +set -- x y z unset ASPELL_CONF for i in a b c ; do if [ -d "$i/lib/aspell" ]; then @@ -392,6 +394,8 @@ echo (set -q cool && echo 'a' || echo) echo (test -n "$cool" && echo 'a' || echo) echo (set -q cool && echo "$cool" || echo 'a') echo (test -n "$cool" && echo "$cool" || echo 'a') + +set argv x y z set -e ASPELL_CONF for i in a b c if [ -d "$i"'/lib/aspell' ] From e4e0c46ab6904cdd182661a7288c9147f446f601 Mon Sep 17 00:00:00 2001 From: Neved4 <63655535+Neved4@users.noreply.github.com> Date: Tue, 19 Nov 2024 14:34:30 +0100 Subject: [PATCH 4/5] Add parsing and tests from `set -` to `set argv` --- translate/translate.go | 12 +++++------- translate/translate_test.go | 2 ++ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/translate/translate.go b/translate/translate.go index aeba46b..3893ac5 100644 --- a/translate/translate.go +++ b/translate/translate.go @@ -431,13 +431,11 @@ func (t *Translator) parseSetExpr(args []*syntax.Word) bool { next, _ := lit(args[1]) - if next == "--" { - if len(args) > 2 { - t.str("set argv") - for _, arg := range args[2:] { - t.str(" ") - t.word(arg, false) - } + if (next == "--" || next == "-") { + t.str("set argv") + for _, arg := range args[2:] { + t.str(" ") + t.word(arg, false) } return true } diff --git a/translate/translate_test.go b/translate/translate_test.go index 6a993c4..a7a5561 100644 --- a/translate/translate_test.go +++ b/translate/translate_test.go @@ -335,6 +335,7 @@ echo ${cool-a} echo ${cool:-a} set -Cefu set -- x y z +set - x y z unset ASPELL_CONF for i in a b c ; do if [ -d "$i/lib/aspell" ]; then @@ -395,6 +396,7 @@ echo (test -n "$cool" && echo 'a' || echo) echo (set -q cool && echo "$cool" || echo 'a') echo (test -n "$cool" && echo "$cool" || echo 'a') +set argv x y z set argv x y z set -e ASPELL_CONF for i in a b c From 4054ed13c19ebff6defcceb0d99e1b53b5e54f2e Mon Sep 17 00:00:00 2001 From: Neved4 <63655535+Neved4@users.noreply.github.com> Date: Mon, 17 Nov 2025 13:34:56 +0100 Subject: [PATCH 5/5] Handle set -- ... "$@" appends --- translate/translate.go | 28 +++++++++++++++++++++++++++- translate/translate_test.go | 2 ++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/translate/translate.go b/translate/translate.go index 3153674..ffc9cf6 100644 --- a/translate/translate.go +++ b/translate/translate.go @@ -448,7 +448,18 @@ func (t *Translator) parseSetExpr(args []*syntax.Word) bool { next, _ := lit(args[1]) - if (next == "--" || next == "-") { + if next == "--" || next == "-" { + if len(args) >= 3 && isAtWord(args[len(args)-1]) { + if len(args) > 3 { + t.str("set -a argv") + for _, arg := range args[2 : len(args)-1] { + t.str(" ") + t.word(arg, false) + } + } + return true + } + t.str("set argv") for _, arg := range args[2:] { t.str(" ") @@ -466,6 +477,21 @@ func (t *Translator) parseSetExpr(args []*syntax.Word) bool { return true } +func isAtWord(w *syntax.Word) bool { + if len(w.Parts) != 1 { + return false + } + dq, ok := w.Parts[0].(*syntax.DblQuoted) + if !ok || len(dq.Parts) != 1 { + return false + } + param, ok := dq.Parts[0].(*syntax.ParamExp) + if !ok { + return false + } + return param.Param.Value == "@" +} + func (t *Translator) callExpr(c *syntax.CallExpr) { if len(c.Args) == 0 { // assignment diff --git a/translate/translate_test.go b/translate/translate_test.go index 5f1a4cb..d7d171e 100644 --- a/translate/translate_test.go +++ b/translate/translate_test.go @@ -338,6 +338,7 @@ echo ${cool:-a} set -Cefu set -- x y z set - x y z +set -- x "$@" unset ASPELL_CONF for i in a b c; do if [ -d "$i/lib/aspell" ]; then @@ -404,6 +405,7 @@ echo (test -n "$cool" && echo "$cool" || echo 'a') set argv x y z set argv x y z +set -a argv x set -e ASPELL_CONF for i in a b c if [ -d "$i"'/lib/aspell' ]