*** Running test-ast-formats
(C (w <Lit_Chars echo>) (w <Lit_Chars hi>))
(command.Simple
  blame_tok:(Token
    id:Lit_Chars
    length:4
    col:0
    line:(SourceLine line_num:1 content:"echo hi" src:(source.CFlag))
  )
  more_env:[]
  words:[
    (CompoundWord parts:[...0x7f6218597600])
    (CompoundWord
      parts:[(Token id:Lit_Chars length:2 col:5 line:...0x7f62185ad418)]
    )
  ]
  is_last_cmd:F
)
OK  test-ast-formats
*** Running test-exit-builtin-interactive
osh-0.27$ one
OK  test-exit-builtin-interactive
*** Running test-help
Oils 0.27.0		https://oils.pub/

~~~ oils-usage ~~~

bin/oils-for-unix is an executable that contains OSH, YSH, and more.

Usage:
    oils-for-unix MAIN_NAME ARG*
    MAIN_NAME ARG*

It behaves like busybox.  The command name can be passed as the first argument:

    oils-for-unix ysh -c 'echo hi'

More commonly, it's invoked through a symlink like 'ysh', which causes it to
behave like that command:

    ysh -c 'echo hi'

~~~ shell-flags ~~~

osh and ysh accept standard POSIX shell flags, like:

    bin/osh -o errexit -c 'false'
    bin/ysh -n myfile.ysh
    bin/ysh +o errexit -c 'false; echo ok'

They also accept these flags:

    -n                Parse the program but don't execute it.  Print the AST.
    --ast-format FMT  The format for the AST (text|text-abbrev)
    --eval FILE       Evaluate the given file, similar to the 'source' builtin.
                      Specify it multiple times to run multiple files.  The
                      shell stops on normal errors, as well as when $? is
                      non-zero after evaluating a file (even if errexit is
                      off).
    --tool            Run a tool instead of the shell (cat-em|syntax-tree)

Examples:

    osh -n -c 'hello'                    # pretty-print the AST
    ysh --ast-format text -n -c 'hello'  # print it full

Oils 0.27.0		https://oils.pub/

~~~ osh-usage ~~~

bin/osh is compatible with POSIX shell, bash, and other shells.

Usage:
   osh FLAG* SCRIPT ARG*
   osh FLAG* -c COMMAND ARG*
   osh FLAG*

Examples:
    osh -c 'echo hi'
    osh myscript.sh
    echo 'echo hi' | osh

~~~ shell-flags ~~~

osh and ysh accept standard POSIX shell flags, like:

    bin/osh -o errexit -c 'false'
    bin/ysh -n myfile.ysh
    bin/ysh +o errexit -c 'false; echo ok'

They also accept these flags:

    -n                Parse the program but don't execute it.  Print the AST.
    --ast-format FMT  The format for the AST (text|text-abbrev)
    --eval FILE       Evaluate the given file, similar to the 'source' builtin.
                      Specify it multiple times to run multiple files.  The
                      shell stops on normal errors, as well as when $? is
                      non-zero after evaluating a file (even if errexit is
                      off).
    --tool            Run a tool instead of the shell (cat-em|syntax-tree)

Examples:

    osh -n -c 'hello'                    # pretty-print the AST
    ysh --ast-format text -n -c 'hello'  # print it full

Oils 0.27.0		https://oils.pub/

~~~ ysh-usage ~~~

bin/ysh is the shell with data tYpes, influenced by pYthon, JavaScript, ...

Usage:
    ysh FLAG* SCRIPT ARG*
    ysh FLAG* -c COMMAND ARG*
    ysh FLAG*

Examples:
    ysh -c 'echo hi'
    ysh myscript.ysh
    echo 'echo hi' | ysh

Note that bin/ysh is the same as bin/osh with the ysh:all option group set:
    osh -o ysh:all -c 'echo hi'  # Same as YSH

~~~ shell-flags ~~~

osh and ysh accept standard POSIX shell flags, like:

    bin/osh -o errexit -c 'false'
    bin/ysh -n myfile.ysh
    bin/ysh +o errexit -c 'false; echo ok'

They also accept these flags:

    -n                Parse the program but don't execute it.  Print the AST.
    --ast-format FMT  The format for the AST (text|text-abbrev)
    --eval FILE       Evaluate the given file, similar to the 'source' builtin.
                      Specify it multiple times to run multiple files.  The
                      shell stops on normal errors, as well as when $? is
                      non-zero after evaluating a file (even if errexit is
                      off).
    --tool            Run a tool instead of the shell (cat-em|syntax-tree)

Examples:

    osh -n -c 'hello'                    # pretty-print the AST
    ysh --ast-format text -n -c 'hello'  # print it full

Oils 0.27.0		https://oils.pub/

~~~ osh-usage ~~~

bin/osh is compatible with POSIX shell, bash, and other shells.

Usage:
   osh FLAG* SCRIPT ARG*
   osh FLAG* -c COMMAND ARG*
   osh FLAG*

Examples:
    osh -c 'echo hi'
    osh myscript.sh
    echo 'echo hi' | osh

~~~ shell-flags ~~~

osh and ysh accept standard POSIX shell flags, like:

    bin/osh -o errexit -c 'false'
    bin/ysh -n myfile.ysh
    bin/ysh +o errexit -c 'false; echo ok'

They also accept these flags:

    -n                Parse the program but don't execute it.  Print the AST.
    --ast-format FMT  The format for the AST (text|text-abbrev)
    --eval FILE       Evaluate the given file, similar to the 'source' builtin.
                      Specify it multiple times to run multiple files.  The
                      shell stops on normal errors, as well as when $? is
                      non-zero after evaluating a file (even if errexit is
                      off).
    --tool            Run a tool instead of the shell (cat-em|syntax-tree)

Examples:

    osh -n -c 'hello'                    # pretty-print the AST
    ysh --ast-format text -n -c 'hello'  # print it full

Oils 0.27.0		https://oils.pub/

~~~ oils-usage ~~~

bin/oils-for-unix is an executable that contains OSH, YSH, and more.

Usage:
    oils-for-unix MAIN_NAME ARG*
    MAIN_NAME ARG*

It behaves like busybox.  The command name can be passed as the first argument:

    oils-for-unix ysh -c 'echo hi'

More commonly, it's invoked through a symlink like 'ysh', which causes it to
behave like that command:

    ysh -c 'echo hi'

~~~ shell-flags ~~~

osh and ysh accept standard POSIX shell flags, like:

    bin/osh -o errexit -c 'false'
    bin/ysh -n myfile.ysh
    bin/ysh +o errexit -c 'false; echo ok'

They also accept these flags:

    -n                Parse the program but don't execute it.  Print the AST.
    --ast-format FMT  The format for the AST (text|text-abbrev)
    --eval FILE       Evaluate the given file, similar to the 'source' builtin.
                      Specify it multiple times to run multiple files.  The
                      shell stops on normal errors, as well as when $? is
                      non-zero after evaluating a file (even if errexit is
                      off).
    --tool            Run a tool instead of the shell (cat-em|syntax-tree)

Examples:

    osh -n -c 'hello'                    # pretty-print the AST
    ysh --ast-format text -n -c 'hello'  # print it full

OK  test-help
*** Running test-noexec-fails-properly
  echo; echo; |
              ^
[ -c flag ]:1: Invalid word while parsing command
_tmp/osh-usage-noexec.txt appears empty, as expected
OK  test-noexec-fails-properly
*** Running test-osh-file
===== Hello
hi
inside func
in subshell
another
ComSub
===== EMPTY
===== NO TRAILING NEWLINE
hi
OK  test-osh-file
*** Running test-osh-interactive
osh-0.27$ hi
osh-0.27$ ^D
osh-0.27$ osh-0.27$   ;
  ^
[ stdin -i ]:1: Invalid word while parsing command
osh-0.27$ ^D
osh-0.27$   ;echo OIL OIL
  ^
[ stdin -i ]:1: Invalid word while parsing command
osh-0.27$ ^D
osh-0.27$ osh-0.27$ ^D
OK  test-osh-interactive
*** Running test-osh-stdin
hi
inside func
in subshell
another
ComSub
===== EMPTY
===== NO TRAILING NEWLINE
hi

hi

line continuation
two
here doc
command sub
OK  test-osh-stdin
*** Running test-rc-file
TESTRC$ ^D
osh-0.27$ ^D
osh-0.27$ ^D
OK  test-rc-file
*** Running test-version
Oils 0.27.0		https://oils.pub/

Release Date: -
Arch: x86_64
OS: Linux
Platform: #25~22.04.1-Ubuntu SMP Thu Jan 16 21:37:09 UTC 2025
Compiler: GCC 8.3.0
Interpreter: CPython
Interpreter version: 2.7.16
Bytecode: -
OK  test-version

test/osh-usage.sh: 9 tests passed.