@@ -16,6 +16,7 @@ import (
1616 "strings"
1717 "sync"
1818
19+ "github.com/google/shlex"
1920 "github.com/gptscript-ai/gptscript/pkg/counter"
2021 "github.com/gptscript-ai/gptscript/pkg/env"
2122 "github.com/gptscript-ai/gptscript/pkg/types"
@@ -119,7 +120,7 @@ func (e *Engine) runCommand(ctx Context, tool types.Tool, input string, toolCate
119120 var extraEnv = []string {
120121 strings .TrimSpace ("GPTSCRIPT_CONTEXT=" + strings .Join (instructions , "\n " )),
121122 }
122- cmd , stop , err := e .newCommand (ctx .Ctx , extraEnv , tool , input )
123+ cmd , stop , err := e .newCommand (ctx .Ctx , extraEnv , tool , input , true )
123124 if err != nil {
124125 if toolCategory == NoCategory {
125126 return fmt .Sprintf ("ERROR: got (%v) while parsing command" , err ), nil
@@ -242,7 +243,7 @@ func appendInputAsEnv(env []string, input string) []string {
242243 return env
243244}
244245
245- func (e * Engine ) newCommand (ctx context.Context , extraEnv []string , tool types.Tool , input string ) (* exec.Cmd , func (), error ) {
246+ func (e * Engine ) newCommand (ctx context.Context , extraEnv []string , tool types.Tool , input string , useShell bool ) (* exec.Cmd , func (), error ) {
246247 envvars := append (e .Env [:], extraEnv ... )
247248 envvars = appendInputAsEnv (envvars , input )
248249 if log .IsDebug () {
@@ -252,9 +253,20 @@ func (e *Engine) newCommand(ctx context.Context, extraEnv []string, tool types.T
252253 interpreter , rest , _ := strings .Cut (tool .Instructions , "\n " )
253254 interpreter = strings .TrimSpace (interpreter )[2 :]
254255
255- args := strings .Fields (interpreter )
256+ var (
257+ args []string
258+ err error
259+ )
260+ if useShell {
261+ args = strings .Fields (interpreter )
262+ } else {
263+ args , err = shlex .Split (interpreter )
264+ if err != nil {
265+ return nil , nil , err
266+ }
267+ }
256268
257- envvars , err : = e .getRuntimeEnv (ctx , tool , args , envvars )
269+ envvars , err = e .getRuntimeEnv (ctx , tool , args , envvars )
258270 if err != nil {
259271 return nil , nil , err
260272 }
@@ -297,6 +309,9 @@ func (e *Engine) newCommand(ctx context.Context, extraEnv []string, tool types.T
297309 if strings .HasPrefix (s , "!" ) {
298310 return envMap [s [1 :]]
299311 }
312+ if ! useShell {
313+ return envMap [s ]
314+ }
300315 if runtime .GOOS == "windows" {
301316 return "%" + s + "%"
302317 }
@@ -306,9 +321,14 @@ func (e *Engine) newCommand(ctx context.Context, extraEnv []string, tool types.T
306321
307322 if runtime .GOOS == "windows" {
308323 args [0 ] = strings .ReplaceAll (args [0 ], "/" , "\\ " )
309- args = append ([]string {"cmd.exe" , "/c" }, strings .Join (args , " " ))
310- } else {
311- args = append ([]string {"/bin/sh" , "-c" }, strings .Join (args , " " ))
324+ }
325+
326+ if useShell {
327+ if runtime .GOOS == "windows" {
328+ args = append ([]string {"cmd.exe" , "/c" }, strings .Join (args , " " ))
329+ } else {
330+ args = append ([]string {"/bin/sh" , "-c" }, strings .Join (args , " " ))
331+ }
312332 }
313333
314334 cmd := exec .CommandContext (ctx , args [0 ], args [1 :]... )
0 commit comments