---
name: "gosh"
section: "1"
platform: "linux"
package: "gauche"
version: "0.9.15-p2+20241205-4"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/gosh"
---

# gosh(1)

a Scheme script interpreter

## NAME

gosh - a Scheme script interpreter

## SYNOPSIS

**gosh** \[-bhiqV\] \[-I *path* \] \[-A *path* \] \[-u *module* \] \[-l *file* \] \[-L *file* \] \[-e *expr* \] \[-E *expr* \] \[-m *module* \] \[-f *flag* \] \[-F *feature* \] \[-p *type* \] \[-r *standard* \] \[--\] \[ *script argument ...* \]\

## DESCRIPTION

*Gosh* is a stand-alone Scheme interpreter built on top of the *Gauche* Scheme script engine.

When *script* is given, gosh loads the script, evaluating Scheme code in it. Then, if the *script* defines a procedure named *main,* gosh calls it with a single argument which is a list of the script name and subsequent arguments. When *main* returns an integer value, gosh exits with it as an exit code. If *main* returns non-integer value, or an error is signaled during evaluation, gosh exits with exit code 70 (EX\_SOFTWARE). See SRFI-22 (http://srfi.schemers.org/srfi-22/srfi-22.html) for details. If there's no *main* procedure defined in the script, gosh exits with code 0 after loading the script file.

If no script file is given, gosh goes into an interactive mode. By default, gosh prompts the user to enter a Scheme expression, read and evaluates it, then prints the result, until EOF is read. If the standard input is not a terminal, however, gosh doesn't print a prompt; it allows a user to use gosh as a filter program. This behavior can be controlled by -i or -b option; see below.

## OPTIONS

Command line options are processed before loading the script file or entering the interactive mode.

The options -I, -A, -u, -l, -L, -e and -E are processed in the order of appearance.  For example, adding a load path by -I option affects the -l options after it, but not the ones before it.

- **-V**

  Prints gosh version and exits.

- **-b**

  Batch mode.  Doesn't print prompt even the standard input is a terminal.  Supersedes -i.

- **-h**

  Print help message to stdout and exit with 0.

- **-i**

  Interactive mode.  Forces to print prompt, even the standard input is not a terminal.

- **-q**

  Prevents reading the default initialization file.

- **-I***path*

  Adds *path* in front of the load path list.

- **-A***path*

  Appends *path* to the tail of the load path list.

- **-u***module*

  Loads and imports *module,* as if "(use *module* )" is specified in the code.

- **-l***file*

  Loads a Scheme file *file.*

- **-L***file*

  Like -l, but doesn't complain if *file* doesn't exist.

- **-e***expr*

  Evaluates a Scheme expression *expr.*

- **-E***expr*

  Same as -e, except that the *expr* is read as if it is surrounded by parenthesis.

- **-m***module*

  When the script file is given, this option specifies the name of the module in which the "main" procedure is defined. The default is "user".

- **-p***type*

  Turns on the profiler. *Type* can be either 'time' or 'load'.

- **-r***standard*

  Starts gosh with the default environment defined in RnRS, where n is determined by *standard.* Currently, only 7 is the valid value of *standard.*

- **-v***version*

  If *version* is not the running Gauche's version, but the specified verision is installed in the system, execute that version's gosh instead. This is useful when you want to invoke a specific version of Gauche. The version must be 0.9.6 or later.

- **-f***flag*

  Sets various flags.\
     case-fold       use case-insensitive reader (as in R5RS)\
     load-verbose    report while loading files\
     include-verbose report while including files\
     no-inline       don't inline primitive procedures and constants\
                     (combined no-inline-globals, no-inline-locals,\
                     no-inline-constants and no-inline-setters.)\
     no-inline-globals don't inline global procedures.\
     no-inline-locals  don't inline local procedures.\
     no-inline-constants don't inline constants.\
     no-inline-setters don't inline setters.\
     no-post-inline-pass don't run post-inline optimization pass.\
     no-lambda-lifting-pass don't run lambda lifting optimization pass.\
     no-post-inline-pass  don't run post-inline optimization pass.\
     no-source-info  don't retain source information.\
     read-edit       enable input editing mode, if terminal supports it.\
     no-read-edit    disable input editing mode.\
     safe-string-cursors performs extra validation for use of string cursors.\
     warn-legacy-syntax print warning when legacy Gauche syntax\
                     is encountered.\
     test            assume being run in the build tree; tries to\
                     load files from the current build instead of\
                     installation directories.  Useful to test\
                     the build without installation.

- **-F***feature*

  Makes *feature* available in cond-expand forms.

- **--**

  Specifies that there are no more options.  If there are more arguments after this, they are taken as script file name and its arguments.

## ENVIRONMENT

- **GAUCHE\_LOAD\_PATH** A colon separated list of the load paths.

  The paths are appended before the system default load paths.

- **GAUCHE\_DYNLOAD\_PATH** A colon separated list of the load paths for dynamically loaded

  objects. The paths are appended before the system default load paths.

## AUTHORS

Shiro Kawai (shiro @ acm . org)

## SEE ALSO

[gauche-config(1)](/gauche-config/1.md)

Gauche Scheme script engine:\
 https://practical-scheme.net/gauche/

For the information about Scheme language, see\
 https://www.schemers.org/
