gitlabEdit

badge-checkCommand Parsing

How command parsing works

If the GetLine() function got your input by pressing ENTER, the shell manager attempts to do the following steps:

1

Splits the commands separated with semicolons

It attempts to split any command with the semicolon between them, like:

command1 arg1 arg2 ; command2 arg3 arg4
2

Ignores the comments

Any command that starts with either a space or a hashtag will be ignored as a comment, like: (Notice the extra space in the first comment)

 comment
#comment
3

Splits the words of arguments

The first word is a command, and all words following it in a single command text are the series of arguments. These words then get split to arguments (without the switch indicator -switch) and switches (arguments that come after the dash) using the ProvidedArgumentsInfo class, though it does much more than that.

chevron-rightVariables for the provided arguments info classhashtag

This class contains these variables:

Variable
Description

Command

Target command

ArgumentsText

Provided arguments and switches

ArgumentsList

Array of arguments without the switches

SwitchesList

Array of switches

RequiredArgumentsProvided

Checks to see if the arguments are provided or not

RequiredSwitchesProvided

Checks to see if the required switches are provided or not

RequiredSwitchArgumentsProvided

Checks to see if the required switch arguments are provided or not

4

Decides the command to be executed

After the above class constructor is called, the shell attempts to execute an alias command, if found. Else, the built-in command is going to be executed.

5

Checks for redirection

The shell checks for these redirection flags:

Flag
Description
Example

>>

Redirects the output to a file, overwriting the target file

command >> target.txt

>>>

Redirects the output to a file, appending to the target file

command >>> target.txt

|SILENT|

Redirects the output to a null console driver, which means no output

command |SILENT|

If these flags are found, the shell sets the console driver as appropriate.

6

Starts the executor thread

Finally, the command executor thread is fired up with the ExecuteCommandParameters instance to hold command execution parameters for the same thread. The thread is then started.

7

Checks the nature of the command

However, the command executor checks for these:

  • If the provided command is an MESH script, the shell invokes a script executor.

  • If the command is an external program found in the shell lookup path, which is usually $PATH, the shell attempts to scan these directories for the program and execute it.

  • If the command is an internal command, it creates a separate thread for the command and starts it.

Wrapped commands

The ExecuteCommandWrapped() function allows you to execute a command in wrapped mode from your commands that have the CommandFlags.Wrappable flag.


Command-line Arguments

The command-line arguments feature is backported from Nitrocid KS with more customization in place. This allows you to create a console application that handles arguments deeply, such as support for argument values.

To parse the arguments, you'll have to define a statically defined dictionary in a static class with a type of Dictionary<string, ArgumentInfo>, given that ArgumentInfo can be constructed with the following:

Variable
Description

Argument

The argument name that users will have to write down

HelpDefinition

The description of the argument that will be shown in the help renderer

ArgArgumentInfo

An array of argument info instances that will modify its behavior

ArgumentBase

An argument executor instance that holds the actual code for the argument

Obsolete

Whether this argument is obsolete or not

Afterwards, you can use the ParseArguments() function somewhere in the main application code. You can find the relevant classes in the Terminaux.Shell.Arguments.Base namespace.

Command parameters class

The CommandParameters class contains information about the passed command parameters, such as the command text, the argument list, and more. Additionally, you can get the switch value or values, check if a switch is passed or not, and check to see if a switch's value is numeric using available functions in the class.


Special characters

If a command, such as wrap, is set to use the arguments string, you can escape special characters, as long as these characters are known. For example, if you want to pass a switch to a wrapped command, you can use the wrap command like this:

Last updated