syntax
lxinitd, lxmenu, and rosh share the same litesh syntax.
Basic Syntax
litesh scripts contain one command per line with arguments.
Here's an example from an lxc container /etc/init.d/rcS.
#!/bin/rosh
/sbin/mount -a
/sbin/ip addr add 10.0.3.27 dev eth0
/sbin/ip route add default via 10.0.3.1
# start the process
/sbin/xtomp
Blank lines are ignored, lines that start with # are comments.
Each line is executed as a subprocess, except limited builtins.
Commands are executed with execv() so they repect $PATH and require absolute paths or ./.
Shebang
The shebang (#!/bin/rosh) is required, even if started with /bin/rosh script
The shebang does not accept arguments or switches.
Textual content
The following rules apply to the content of scripts
- max 2048 line length
- max 10 arguments to a command
- ascii 7bit only, no tabs, no invisible chars apart from space ' ' and \n
- no \0 characters
- no utf-8
Whitespace
\n exclusivly splits commands, use of \r is an error.
Whitespace character (ascii 20) exclusivly splits args. No support for $IFS.
The double quote character " is used to wrap strings with spaces. To print quote or slash use standard C string escaping \\ and \".
Builtins
builtins are commands that can be executed without ./
The builtins available are dependent on the context.
Environment variables
In shell environments (rosh, lxinitd) environment varaibles expansion is supported.
Scripts use ${var} syntax, brackets are requried. Emtpy variables result in the empty string "", variables placed together are concatenated.
e.g.
echo ${USER}
echo $USER # syntax error
echo ${USER}${USER} # concatenated
echo "${USER}${USER}" # concatenated
echo "${USER} ${USER}" # concatenated
echo ${USER} ${USER} # not concatenated
Branching
Branching is supported with if, elif, else, fi.
e.g.
if command
echo ${var2}
elif command
echo ${var2}
else
echo ${var3}
fi
The command is forked and exiting zero is considered true.
N.B. in order for useful branching it may be useful to copy /usr/bin/test and symlink /usr/bin/[, this is not done by default in lxinitd containers.
The commands "true" and "false" are handled by builtins and do not fork.
if ${debug}
echo ${var2}
fi
A future version may implement [[, syntax should be considered reserved.