[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [volume] [parte]


Capitolo 35.   File eseguibili

I file normali che hanno i permessi di esecuzione, sono intesi dal sistema operativo come dei programmi che possono essere messi in funzione. Naturalmente, perché si possa trattare effettivamente di programmi è necessario che il sistema sia in grado di eseguire il loro contenuto.

35.1   Avvio di un programma e variabile di ambiente «PATH»

In linea di principio, l'avvio di un programma richiede l'indicazione del percorso, relativo o assoluto:

/bin/uname -a[Invio]

Linux dinkel 2.2.15 #1 Thu Aug 31 15:55:32 CEST 2000 i586 unknown

Tuttavia, spesso non si sa precisamente dove sia collocato questo o quel programma eseguibile, ma di solito è possibile avviarlo ugualmente lasciando che sia il sistema stesso a trovarlo automaticamente:

uname -a[Invio]

Linux dinkel 2.2.15 #1 Thu Aug 31 15:55:32 CEST 2000 i586 unknown

Questo automatismo dipende dalla configurazione della variabile di ambiente PATH, che serve a elencare i percorsi degli eseguibili:

echo $PATH[Invio]

/usr/local/bin:/usr/bin:/bin:/usr/bin/X11

I percorsi elencati, separati dai due punti verticali, rappresentano le directory in cui vengono cercati i file eseguibili quando per questi non è stato specificato il percorso (l'elenco del proprio sistema potrebbe essere molto più lungo).

Generalmente, nel percorso di avvio degli eseguibili è esclusa la directory corrente, che dovrebbe essere rappresentata con un punto singolo, .; per verificare questa cosa, si può copiare un programma noto nella propria directory personale.

cd[Invio]

cp /bin/uname ./mio_uname[Invio]

A questo punto, nella propria directory personale è stato copiato il programma uname, chiamato localmente mio_uname. Si può verificare che sia ancora in grado di funzionare:

./mio_uname -a[Invio]

Linux dinkel 2.2.15 #1 Thu Aug 31 15:55:32 CEST 2000 i586 unknown

Tuttavia, non è possibile avviare il programma senza specificare il percorso:

mio_uname -a[Invio]

bash: mio_uname: command not found

Esiste un buon motivo per evitare di avviare automaticamente i programmi esistenti nella directory corrente; tuttavia, sarebbe facile includere questa possibilità modificando il contenuto della variabile PATH:

export PATH="$PATH:."[Invio]

echo $PATH[Invio]

/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:.

A questo punto il programma mio_uname si può avviare automaticamente senza specificare il percorso:

mio_uname -a[Invio]

Linux dinkel 2.2.15 #1 Thu Aug 31 15:55:32 CEST 2000 i586 unknown

Nell'ambito dei percorsi di ricerca elencati nella variabile di ambiente PATH, ci potrebbero essere più programmi diversi con lo stesso nome. Per sapere quale di questi viene avviato per primo, basta verificare con which:

which uname[Invio]

/bin/uname

which mio_uname[Invio]

./mio_uname

Volendo modificare il nome della propria copia locale del programma, usando lo stesso nome originale, si può verificare quale dei due venga messo in funzione effettivamente, in mancanza dell'indicazione di un percorso:

mv mio_uname uname[Invio]

which uname[Invio]

/bin/uname

Se si modifica l'ordine dei percorsi di ricerca nella variabile di ambiente PATH, si può invertire il risultato. In tal caso si aggiunge la directory corrente all'inizio dell'elenco, restando anche l'indicazione finale che comunque è inutile:

export PATH=".:$PATH"[Invio]

echo $PATH[Invio]

.:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:.

which uname[Invio]

./uname

35.2   Comandi interni di shell

Non sempre ciò che si avvia è un programma eseguibile; potrebbe essere un comando interno della shell. Per esempio, nel caso della shell Bash, si può usare il comando help per ottenere un elenco completo di questi:

help[Invio]

GNU bash, version 2.05b.0(1)-release (i386-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 ; }                    

Dal momento che un sistema ben equipaggiato deve poter consentire l'uso di shell differenti, si affiancano spesso dei programmi eseguibili equivalenti a comandi interni di shell già disponibili. Per esempio, può esistere il programma echo, benché la shell Bash lo fornisca come comando interno.

help echo[Invio]

echo: echo [-neE] [arg ...]
    Output the ARGs.  If -n is specified, the trailing newline is
    suppressed.  If the -e option is given, interpretation of the
    following backslash-escaped characters is turned on:
        \a      alert (bell)
        \b      backspace
        \c      suppress trailing newline
        \E      escape character
        \f      form feed
        \n      new line
        \r      carriage return
        \t      horizontal tab
        \v      vertical tab
        \\      backslash
        \num    the character whose ASCII code is NUM (octal).
    
    You can explicitly turn off the interpretation of the above characters
    with the -E option.

Quello che si vede è la sintassi del comando interno echo, mentre il programma echo può essere leggermente differente:

/bin/echo --help[Invio]

Usage: /bin/echo [OPTION]... [STRING]...
Echo the STRING(s) to standard output.

  -n              do not output the trailing newline
  -e              enable interpretation of the backslash-escaped characters
                    listed below
  -E              disable interpretation of those sequences in STRINGs
      --help      display this help and exit (should be alone)
      --version   output version information and exit (should be alone)

Without -E, the following sequences are recognized and interpolated:

  \NNN   the character whose ASCII code is NNN (octal)
  \\     backslash
  \a     alert (BEL)
  \b     backspace
  \c     suppress trailing newline
  \f     form feed
  \n     new line
  \r     carriage return
  \t     horizontal tab
  \v     vertical tab

Report bugs to <bug-sh-utils@gnu.org>.

35.3   Script e permessi di esecuzione

In un sistema Unix è facile realizzare dei programmi elementari in forma di raccolta di comandi, ovvero in forma di script di shell. Si può provare a realizzare il file mio_script nella directory corrente con il contenuto seguente:

#!/bin/sh
echo Ciao a tutti!

Si tratta di un file di testo che si può costruire facilmente con VI. Se questo file viene salvato con il nome previsto, ovvero mio_script, ci si può aspettare di poterlo mettere in funzione con il comando seguente:

./mio_script[Invio]

bash: ./mio_script: Permission denied

Come si vede, lo script non viene avviato. Si può verificare che mancano i permessi necessari:

ls -l mio_script[Invio]

-rw-rw-r--    1 tizio    tizio          20 mar 24 10:54 mio_script

Ecco che basta aggiungere i permessi mancanti e tutto funziona regolarmente:

chmod +x mio_script[Invio]

ls -l mio_script[Invio]

-rwxrwxr-x    1 tizio    tizio          20 mar 24 10:54 mio_script

./mio_script[Invio]

Ciao a tutti!

35.4   Conclusione

Nei sistemi Unix si parla spesso di «comandi», in modo volutamente vago, per non dover specificare se si tratti di eseguibili veri e propri, o di comandi interni all'interprete (la shell).

Se si indica il nome di un comando senza specificare un percorso, si lascia fare la scelta all'interprete dei comandi, per cui viene cercato prima un comando interno, eventualmente un alias, quindi si cerca un file eseguibile nell'elenco dei percorsi contenuti nella variabile PATH.

Quando si realizza un programma o uno script di shell, occorre ricordare di dare i permessi di esecuzione perché questo possa funzionare.

Appunti di informatica libera 2007.02 --- Copyright © 2000-2007 Daniele Giacomini -- <daniele (ad) swlibero·org>


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome file_eseguibili.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico]

Valid ISO-HTML!

CSS validator!