3.4.8 Comandi interni ed esterni

Bash riesce ad interpretare un insieme di comandi interni (internal command o built-in command), implementati all’interno di Bash. L’elenco di tali comandi è ottenibile tramite il comando interno help.

____________________________________________________________________

Comando (bash): help

SINTASSI  
$ help [cmd]  
DESCRIZIONE

____________________________________________________________________________________________________________________

Se nessun comando è specificato, help mostra l’elenco dei comandi interni, come quello riportato di seguito:

GNU bash, version 2.05b.0(1)-release (i686-pc-linux-gnu)
These shell commands are defined internally.  Type `help' to see this list.
Type `help name' to find out more about the function `name'.
Use `info bash' to find out more about the shell in general.
Use `man -k' or `info' to find out more about commands not in this list.
A star (*) next to a name means that the command is disabled.
 %[DIGITS | WORD] [&]               (( expression ))
 . filename                         :
 [ arg... ]                         [[ expression ]]
 alias [-p] [name[=value] ... ]     bg [job_spec]
 bind [-lpvsPVS] [-m keymap] [-f fi break [n]
 builtin [shell-builtin [arg ...]]  case WORD in [PATTERN [| PATTERN].
 cd [-L|-P] [dir]                   command [-pVv] command [arg ...]
 compgen [-abcdefgjksuv] [-o option complete [-abcdefgjksuv] [-pr] [-o
 continue [n]                       declare [-afFirtx] [-p] name[=valu
 dirs [-clpv] [+N] [-N]             disown [-h] [-ar] [jobspec ...]
 echo [-neE] [arg ...]              enable [-pnds] [-a] [-f filename]
 eval [arg ...]                     exec [-cl] [-a name] file [redirec
 exit [n]                           export [-nf] [name[=value] ...] or
 false                              fc [-e ename] [-nlr] [first] [last
 fg [job_spec]                      for NAME [in WORDS ... ;] do COMMA
 for (( exp1; exp2; exp3 )); do COM function NAME { COMMANDS ; } or NA
 getopts optstring name [arg]       hash [-lr] [-p pathname] [-dt] [na
 help [-s] [pattern ...]            history [-c] [-d offset] [n] or hi
 if COMMANDS; then COMMANDS; [ elif jobs [-lnprs] [jobspec ...] or job
 kill [-s sigspec | -n signum | -si let arg [arg ...]
 local name[=value] ...             logout
                                                                        
                                                                        
popd [+N | -N] [-n]                printf format [arguments]
pushd [dir | +N | -N] [-n]         pwd [-PL]
read [-ers] [-u fd] [-t timeout] [ readonly [-anf] [name[=value] ...]
return [n]                         select NAME [in WORDS ... ;] do CO
set [--abefhkmnptuvxBCHP] [-o opti shift [n]
shopt [-pqsu] [-o long-option] opt source filename
suspend [-f]                       test [expr]
time [-p] PIPELINE                 times
trap [arg] [signal_spec ...] or tr true
type [-afptP] name [name ...]      typeset [-afFirtx] [-p] name[=valu
ulimit [-SHacdflmnpstuv] [limit]   umask [-p] [-S] [mode]
unalias [-a] [name ...]            unset [-f] [-v] [name ...]
until COMMANDS; do COMMANDS; done  variables - Some variable names an
wait [n]                           while COMMANDS; do COMMANDS; done
{ COMMANDS ; }
Tali comandi, assieme ai nomi dei file eseguibili ed ai simboli che rappresentano gli operatori aritmetico-logici, formano lo scripting language interpretato da Bash, cioè è possibile scrivere dei file di testo, detti script, contenenti comandi che possono essere interpretati ed eseguiti da Bash stessa (v. sez. 3.4.10).

Quando viene impartito un comando, la shell tenta di eseguirlo effettuando, nell’ordine, i seguenti passi:

  1. Tenta di eseguire il comando interno con il nome specificato come command;
  2. Ricerca il file specificato come command. Se tale file è specificato completo di path (sia esso assoluto o relativo) il file è ricercato soltanto nel path specificato. Se non è specificato nessun path, il file viene ricercato nell’elenco delle directory contenuto nella variabile d’ambiente PATH7. Se il file esiste, va al passo successivo;

    È opportuno notare il fatto che nell’elenco delle directory contenute nella variabile d’ambiente PATH, per motivi di sicurezza, non è compresa la working directory (‘.’). Infatti, includendo tale directory nell’elenco (in modo particolare all’inizio dell’elenco), un utente malizioso potrebbe aver chiamato un file presente nella sua directory con lo stesso nome di quello di un comando di sistema di uso frequente, ad esempio ls. In questo modo, se il superuser ha, in un certo momento, la working directory impostata su quella dell’utente in questione e digita il comando ls (o un alias che si riferisce ad esso), lancia in realtà il comando che si trova nella working directory, ovvero lancia in esecuzione tale file con i privilegi di superuser. Il processo da questo lanciato potrebbe fare qualunque cosa sul filesystem!

    Tale directory può comunque essere aggiunta in coda all’elenco delle directory (strategia più sicura)8 con il comando  
    $ export PATH=$PATH:.  
    o in testa (strategia più rischiosa) con il comando  
    $ export PATH=.:$PATH  

  3. Tenta di eseguire il file specificato come command. Per poter essere eseguito il file deve esistere ed avere il permesso di esecuzione per l’utente che ha impartito il comando. In tal caso la shell crea un processo figlio per l’esecuzione delle istruzioni contenute nel file, secondo quanto riportato di seguito

(figura forking processi) [da completare ...]

La shell può essere terminata per mezzo del comando interno exit.