[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [translators] [docinfo] [indice analitico] [volume] [parte]
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.
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 |
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>. |
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:
|
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! |
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 2006.07.01 --- Copyright © 2000-2006 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] [translators] [docinfo] [indice analitico]