Molti programmi fanno uso di questa tecnica in cui esiste un singolo eseguibile che modifica il suo comportamento in base alla modalità di esecuzione.
In genere c'è una struttura all'interno del programma chiamata un'istruzione case / switch che determina il nome con cui è stato chiamato l'eseguibile e quindi chiamerà la funzionalità appropriata per quel nome eseguibile. Quel nome è di solito il primo argomento ricevuto dal programma. Ad esempio, C
quando scrivi:
int main(int argc, char** argv)
argv[0]
contiene il nome dell'eseguibile chiamato. Almeno, questo è il comportamento standard per tutte le shell e tutti gli eseguibili che usano argomenti dovrebbero esserne consapevoli.
Esempio in Perl
Ecco un esempio inventato che ho messo insieme in Perl che mostra anche la tecnica.
Ecco lo script attuale, chiamalo mycmd.pl
:
#!/usr/bin/perl
use feature ':5.10';
(my $arg = $0) =~ s#./##;
my $msg = "I was called as: ";
given ($arg) {
$msg .= $arg when 'ls';
$msg .= $arg when 'find';
$msg .= $arg when 'pwd';
default { $msg = "Error: I don't know who I am 8-)"; }
}
say $msg;
exit 0;
Ecco la configurazione del file system:
$ ls -l
total 4
lrwxrwxrwx 1 saml saml 8 May 24 20:49 find -> mycmd.pl
lrwxrwxrwx 1 saml saml 8 May 24 20:34 ls -> mycmd.pl
-rwxrwxr-x 1 saml saml 275 May 24 20:49 mycmd.pl
lrwxrwxrwx 1 saml saml 8 May 24 20:49 pwd -> mycmd.pl
Ora quando eseguo i miei comandi:
$ ./find
I was called as: find
$ ./ls
I was called as: ls
$ ./pwd
I was called as: pwd
$ ./mycmd.pl
Error: I don't know who I am 8-)