How Command Line Parameters Are Parsed

@sourabhtk37

Question:

How does arguments written in command line reaches the program magically in its form?

SHELL*

EXECVE

MyProg

* - Not always shell.

We were here

EXECVE

#include <unistd.h>

int execve ( const char *filename, char *const argv[], char *const envp[]);

execve -> executes program


filename -> file to be executed/run

argv -> argument vector to be provided

envp -> list of name=value pair in environment

Alternative cousins: execvp, execl, execlp, execle, and execvp

OBSERVATIONS

  • Shell provided parsed argv to "run_execve"
    
    
    
  • Shell -> execve( "run_execve") -> execve("my_prog")

SHELL*

EXECVE

MyProg

* - Not always shell.

We were here

FACT

Cmd-line parsing in Linux is done by the calling process/program before the new process is created.


In Windows it's the opposite.

BREAKING DOWN SHELL

Breaking Down Shell

  • Read from file(shell script) 
$ sh haxxor.sh 
  • or from terminal
$ chsh -s `which fish`

Breaking Down Shell

  • Convert to tokens Using the "Quoting" rules.[0]
  • Alias Expansion

Breaking Down Shell

  • Parsing tokens into simple and compound commands
Simple Commands:   The most common type of command.
Pipelines:   Connecting the input and output of several commands.
Lists:   How to execute commands sequentially.
Compound Commands:   Shell commands for control flow.
Coprocesses:   Two-way communication between commands.
GNU Parallel:   Running commands in parallel.

Compound commands

  • ( ) -> ( list-of-commands ) 
  • A sub-shell environment is created for execution.
  • { } -> { list-of-commands; }
  • No sub-shell environment is created.

Breaking Down Shell

  • Perform Shell Expansion
  • Brace expansion

  • Tilde expansion

  • Parameter and variable expansion

  • Command substitution

  • Arithmetic expansion

  • Word splitting

  • Filename expansion

Brace 

Tilde 

$ mkdir /dir/repo/{stage,develop,master}

# is expanded to

$ mkdir /dir/repo/stage
$ mkdir /dir/repo/develop
$ mkdir /dir/repo/master
$ ~
The value of $HOME

$ ~/foo
$HOME/foo

$ ~+/foo
$PWD/foo

Shell Parameter

$ array[0]=FishIsNice
$ echo ${array:0:4}
Fish

Breaking Down Shell

  • Filename Expansion
$ rm *.py *.c

# expands to 

$ rm xyz.py doge.py exce.py prog.c more.c  

Breaking Down Shell

  • Redirection of input or output
$ yes "USE i3 and fish" > /dev/null

Breaking Down Shell

  • Executing the command. Finally!
  1. Checks for shell functions
  2. Checks in list of builtin
  3. Checks in Hash
  4. Searches in $PATH for executable
  5. Command executed in separate execution environment. From here, arguments are supplied.
  • Waits for command execution and exit status

SHELL*

EXECVE

MyProg

* - Not always shell.

We were here

Questions?

Thank You.

Made with Slides.com